当前位置: 首页 > 科技观察

你如何使用这7个Linux命令?

时间:2023-03-17 18:34:26 科技观察

使用Linux系统的开发者,很多都有自己喜欢的系统命令。下面的命令是我平时用的比较多的。让我分享一下。我不会像教科书一样列出每个命令的详细用法,只是演示日常开发过程中一些场景下常用命令的常见用法。No.1grepgrep,awk,sed这三个命令,作为Linux系统中文本处理的三大法宝,我最喜欢也是最常用的就是grep命令,没有之一!它的基本用法是:grep[OPTIONS]PATTERN[FILE...]grep[OPTIONS][-ePATTERN]...[-fFILE]...[FILE...]好像有这么多选项,我用的最多的两个场景是:1.在一个文件或文件夹中,搜索指定的字符串:grep-rni"pthread"*-r:递归搜索;-n:打印行号;-i:不区分大小写;2.查看某个进程的信息,例如:进程ID$ps-aux|grepbashroot46810.00.1248925912pts/3Ss10:100:00bashroot180520.00.015968960pts/3S+13:380:00grep--color=autobash可以看到grep命令本身出现在结果信息中,可以通过-v选项过滤:$ps-aux|grepbash|grep-vgreproot46810.00.1248925912pts/3Ss10:100:00bash最后结合awk命令,可以提取过程ID4681:$ps-aux|grepbash|grep-vgrep|awk'{print$2}'4681在一些脚本工具中,这种用法还是很常见的。例如:在某些daemon进程的启动脚本中,该指令用于判断一个实例是否已经在当前系统中运行。No.2q看到这个命令,你一定会纳闷:就一个字母q,有什么好神圣的?linux系统中没有这个命令!是的,这封信只是一个化名(alias)。我有很强的强迫症。在终端窗口执行命令时,我经常需要确认命令是否正确执行。在Linux系统中,$?用于表示上一条命令的退出状态:0表示没有错误,其他表示错误。因此,在执行完一个命令后,可以执行下面的命令来确认刚刚执行的命令是否成功。回声$?强迫症的问题解决了,但是因为这个命令用的太频繁了,所以需要敲很多字符,结合shift键。所以我给它设置了一个别名(alias)。设置alias的方法大家都知道,就是在我家目录下的.bashrc中修改。我的别名设置如下:aliasll='ls-lF'aliasla='ls-A'aliasl='ls-CF'aliasq='echo$?'这样的话,每次执行系统命令后,随便敲一个字母q就可以查看执行结果,省时省力!No.3pwd有人可能会疑惑:pwd怎么会是一个普通的命令呢?它的作用是打印当前路径。在命令行窗口中,总是显示路径啊!是的,默认直接显示当前路径信息,如下:root@ubuntu:~/OpenSource/linux-4.15/samples/watchdog$但是这里有个小问题:如果终端窗口的大小不够满screen,如果目录层级比较深,显示的路径信息会特别长。切换回下一行。因此,我喜欢缩短显示的路径:只显示最后一个文件目录,如下:root@ubuntu:watchdog$也就是之前的~/OpenSource/linux-4.15/samples路径信息被丢弃,在本例中,终端窗口中有足够的空间可以输入。如果在某个时候,我想查看当前目录的完整路径,那么只需执行pwd命令即可。这就是我经常使用pwd命令的原因。那么,如何去除显示路径中的目录信息呢?或者修改主目录下的.bashrc文件:if["$color_prompt"=yes];thenPS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$'elsePS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$'Fi找到上面几行,把最后的\w改成\W,也就是把小写的w改成大写的W。如果您正在测试,请不要忘记使用源.bashrc或..bashrc命令重新加载!No.4findfind命令用于查找满足指定条件的文件。我最常见的场景是查找具有指定名称或类型的文件。尤其是在写Makefile的时候经常会遇到找不到头文件的错误,所以可以这样搜索:find./-namexxx.h或者根据后缀名查找文件:find./-name*.txtNo.5historyhistory用于记录执行过的命令。如果你很少使用这个命令,说明你的记忆力非常好!不过对于像我这种记忆力很好的人来说,history命令还是很有用的!我在命令行窗口中测试某段代码,往往需要反复做这样的排查过程:修改代码-编译-执行-查看结果。如果编译命令比较长,相信没有人愿意一个字符一个字符地敲键盘。他们中的大多数使用history来列出最近使用的命令,然后复制并粘贴它们。查看历史命令时,由于输出太多,我们可以结合grep命令,只显示我们感兴趣的命令记录,例如:history|grepgcc,那么结果中只会显示那些带有gcc字样的命令.另外,还有一个小技巧:不看历史,快速输入一条之前执行过的命令(有个前提:你必须能记住那条命令的前几个字符)。例如,之前执行过这个命令:gcc-m32-Wl,--export-dynamic-omainmain.c-ldl几分钟后,我想再次执行这个命令,我可以这样做:按下control和r同时两个键,此时输入光标会变成这样:root@ubuntu:tmp$(reverse-i-search)`':这时候可以输入命令的前几个字母:gcc-m、此时终端会在历史命令记录中查找,输入的字符越多匹配越准确。如果输入的字符与历史命令记录准确匹配,它会立即显示完整的命令。这个小技巧真的很好用,推荐大家试试!No.6odod命令用于输出给定文件的内容。输入文件内容的命令有很多:cat、head、tail等。但是od命令主要是用来查看文件的二进制编码,显示的时候可以在指定的base中显示。在之前的一篇拆解ELF格式的文章:《Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索》中,我使用了很多od指令来读取ELF格式文件中从任意地址开始的任意长度的字节码。例如下面的命令:读取主文件的前52个字节:od-Ax-tx1-N52mainmain是Linux系统中的一个可执行程序,当然是ELF格式的。od命令中使用了以下选项:-Ax:显示地址时,以十六进制表示。如果使用-Ad,表示以十进制显示地址;-t-x1:显示字节码内容时,使用十六进制(x)一次显示一个字节(1);-N52:只需要读取52个字节;可以看出主文件的前四个字节:7f是ELF文件的幻数,454c46是“ELF”的3个字母。所以用od命令来分析二进制文件的内容还是很强大的!No.7forfor这个命令经常出现在脚本文件中,用来处理循环情况,比如:遍历文件和计数,例如:#!/bin/bashforfilein/tmp/*;doecho$file;done我用for的时候,最常见的场景是把很多相同后缀的文件依次重命名:i=0;forxin*.mp4;don=$(printf"%02d""$i");mv$x$n.mp4;leti=i+1;done这里按照纯数字重命名,也可以根据需要加上前缀等字符串。这里还有一个需要注意的小问题:如果文件名中有空格,mv命令会提示错误:mv:target'xxx'isnotadirectory解决方法是:在终端窗口中,先执行这条命令:IFS=''然后,再次执行批量重命名命令,就不会出现错误了!当然,更好的办法是将这些命令写成一个脚本文件,实现对任意类型文件的批量更名功能,然后放到你的私有bin目录中,你可以随时使用。别着急,我已经帮你写好了,如下(file_rename.sh):#!/bin/bashif[$#-eq0];thensufix=mp4elsesufix=$1fiIFS=''i=0;forxin*。$sufix;don=$(printf"%02d""$i");mv$x$n.$sufix;leti=i+1;done只要执行./file_rename.sh,里面的所有mp4文件当前目录将默认保存要重命名的文件。如果是另一种类型的文件,则向其中传递一个参数。例如:如果要批量重命名png格式的图片,执行./file_rename.shpng,最后的png为传入参数,对应脚本文件中的$1变量。本文转载自微信公众号“IOT物联网小镇”,可通过以下二维码关注。转载本文请联系物联小镇公众号。