Linux下命令执行顺序控制与管道
2019-03-02 本文已影响1人
CurryCoder
一、命令执行顺序的控制
-
- 顺序执行多条命令
- 通常情况下,每次只能在终端输入一条命令,执行完成后,再输入第二条命令,然后再按回车执行。要想一次性输入完执行,可以使用简单的顺序执行";"来完成。例如:
sudo apt-get update
sudo apt-get install cowsay
cowsay hello curry - 可以一次性输入sudo apt-get update; sudo apt-get install cowsay; cowsay hello curry
-
- 有选择的执行命令
- 在顺序执行任务时,如果前面的命令执行不成功,而后面的命令又依赖于上一条命令的结果,那么就会造成花了时间,最终却得到一个错误的结果。那么需要能够有选择性的来执行命令。比如:上一条命令执行成功才继续下一条,或者不成功又该做出其他什么处理,比如:可以使用which来查看是否安装某个命令,如果找不到就执行该命令,否则什么也不做。which cowsay> /dev/null && cowsay -f -head -in ohch~
- 在C语言中,&&表示逻辑与,||表示逻辑或,同样shell中也有这两个符号。它们的区别在于,shell中的这两个符号除了可以用于表示逻辑的与和或之外,也可以实现命令执行顺序的简单控制。&&表示如果前面的命令执行结果返回0时,则执行后面的指令;否则不执行。||就是与&&相反的控制效果,当上一条命令执行结果不是0时,则执行它后面的命令。可以从$?环境变量获取上一次命令的返回结果:
which cowsay
echo $? cowsay未安装,结果为1
which cat
echo $? 结果为0 - 除了基本的使用外,还可以结合&&和||来实现一些操作,比如:
which cowsay> /dev/null && echo "exist" || echo "not exist"
二、管道
- 管道是一种通信机制,通常用于进程间的通信(也可以通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出stdout直接作为下一个进程的输入stdin。
- 管道又分为匿名管道和具名管道,在使用一些过滤程序时会经常用到的就是匿名管道,在命令行中由|分隔符表示。
-
- 试用
- 先试用一下管道,比如查看/etc目录下有哪些文件和目录,使用ls命令来查看:
ls -al /etc - 有太多的内容,屏幕不能完全显示,这时候可以使用滚动条或快捷键滚动窗口来查看。不过这时候可以使用管道:
ls -al /etc | less - 通过管道将前一个命令ls的输出作为下一个命令less的输入,然后就可以一行一行的查看。
-
- cut命令,打印每一行的某一段
- 打印/etc/passwd文件中以:分隔符的第一个字段和第六个字段分别表示用户名和home目录:
cut /etc/passwd -d ':' -f 1,6
-
- grep命令,在文本或stdin中查找匹配字符串
- grep命令是很强大的,也是相当常用的一个命令,它结合正则表达式可以实现很复杂却很高效的匹配和查找。搜索/home/cdl目录下所有包含"cdl"的所有文本文件,并显示出现在文本中的行号:
grep -rnI "cdl" ~ - 参数说明:
- -r:表示递归搜索子目录中的文件
- -n:表示打印匹配的行号
- -I:表示忽略二进制文件
- 也可以在匹配字段中使用正则表达式,查看环境变量中以"roon"结尾的字符串
export | grep ".*roon表示一行的末尾
-
- wc命令,简单小巧的计数工具
- wc命令用于统计并输出一个文件中行、单词和字节的数目,参数可以通过wc --help查看。输出/etc/passwd文件的统计信息:
wc /etc/passwd - 再来结合管道来操作一下,下面统计/etc下面的所有目录数:
ls -dl /etc/*/ | wc -l
-
- sort排序命令
- sort功能很简单就是将输入按照一定的方式排序,然后再输出,它支持的排序有按字典排序、数字排序,按月排序,随机排序,反转排序,指定特定字段进行排序等等。
- 默认为字典排序:
cat /etc/passwd | sort - 按特定字段排序:
cat /etc/passwd | sort -t ':' -k 3 -n - 参数说明:
- 默认为字典排序:
- -t:用于指定字段的分隔符
- -k:用于指定对哪个字段进行排序
- -n:如果安装数字排序就要加上-n参数
-
- uniq去重命令
- uniq命令可以用于过滤或输出重复行,使用history命令查看最近执行过的命令:
history | cut -c 8- | cut -d ' ' -f 1 | uniq - 然后,经过层层筛选和过滤,可以发现的确只输出了执行的命令那一列。不过,去重效果不明显,之所以不明显是因为uniq命令只能去除连续重复的行,所以要达到预期效果,需要先进行排序:
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq - 输出重复过的行(重复的只输出一个)及重复次数:
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
-