Linux学习10:命令执行顺序控制与管道

1、命令执行顺序的控制

1)顺序执行多条命令

通常在终端只能输入一条命令,按下回车键,等待执行完成后,再输入第二条命令,或者可以一次性输完,让他自己去依次执行就好了。

简单的顺序执行可以使用 ; 来完成 ,例如在安装软件时:

sudo apt-get update; sudo apt-get install sometool ;
sometool

然后让他自己运行。

2)有选择的执行命令

对于上面的顺序执行,当启动自动顺序执行时,若前面的命令不成功,而后面的命令又依赖于上一条命令的结果,然后花了时间,最后得到一个错误结果,并且有时候还无法直观判断结果是否正确。那就需要有选择的来执行命令,比如,上一条成功之后再执行下一条,或者不成功时进行处理,比如:使用which来查找是否安装某个命令,如果找到就执行,否则不处理:

which cowsay>/dev/null $$ cowsay -f head-in ohch~

如果你没安装cowsay,会发现什么也没发生。你再安好后执行,会发现一头牛。(可以使用which cowsay 查看是否安装了cowsay)

而&& 就是用来实现选择性执行的,表示如果前面的命令执行结果(表示命令执行状态的结果)返回0则执行后面的,否则不执行,可以从 $? 环境变量获取上一次命令的返回结果:

which cowsay
输出 :/usr/games/cowsay

echo $?
输出 :0

&& 表示逻辑与,|| 逻辑或,但在shell里,这两个符号除了此之外,还可以实现这里的命令执行顺序的简单控制||在这里就是与 && 相反的控制效果,当上一条命令执行结果为 ≠0 ($? ≠0) 时则执行后面的命令。

3、管道

管道是一种通信机制,通常用于进程间的通信(也可以通过socket进行网络通信),表现形式就是将前面的每一个进程的输出直接作为下一个进程的输入。

管道又分为匿名管道和具名管道,在使用一些过滤程序时经常会用到的是匿名管道,在命令行中由 | 分隔符表示 。具名管道就是有名字的管道,通常只会在源程序中用到具名管道。

例子 :

查看 /etc 目录下有哪些文件和目录,使用 ls 命令来查看 :

ls -al /etc

有太多内容,屏幕不能完全显示,可以使用滚动条或者快捷键滚动窗口来查看。但此时也可以使用管道:
ls -al /etc | less (-al 显示全部)

通过管道将前一个命令 ls 的输出作为下一个命令 less 的输入,然后就可以一行一行的查看 。

@cut 命令,打印每一行的某一字段

打印 /etc/passwd 文件中以 : 为分隔符的第一个字段和第六个字段分别表示用户名和其家目录:
cut /etc/passwd -d ‘:’ -f 1,6

打印 /etc/passwd 文件中的每一行的前N个字符
前五个(包含):
cut /etc/passwd -c -5

前五个之后的(包含第五个):
cut /etc/passwd -c 5-

第五个:
cut /etc/passwd -c 5

2到5之间(含5):
cut /etc/passwd -c 2-5

@ grep 命令,在文本中或stdin 中查找匹配字符串

grep 命令很强大,结合正则表达式可以实现很复杂却高效的匹配和查找。

grep 的一般形式 :
grep [命令选项] … 用于匹配的表达式[文件] …

查找所有包含hello的所有文本文件,并显示出现在文本中的行号 :
grep -rnI “hello” ~

-r 表示递归搜索子目录中的文件,-n 表示打印匹配项行号,-I表示忽略二进制文件。

查看环境变量中以“ h ”结尾的字符串 :
export | grep “.*h$”

$ 表示一行的末尾

(export :设置或显示环境变量

export [-fnp][变量名称] = [变量设置值]可新增、修改或删除环境变量,供后续执行程序使用

-f :代表变量名中为函数名称
-n :删除指定的变量。实际并未删除,知识不会输出到后续指定的执行环境中。
-p :列出所有的shell 赋予程序的环境变量

@wc 命令,简单小巧的计数工具

用于统计并输出一个文件中行、单词和字节的数目,比如输出 /etc/passwd 文件的统计信息 :
wc /etc/passwd

分别输出行数、单词数、字节数、字符数、和输入文本中最长的一行字节数 :

行数 : wc -l /etc/passwd

单词数 : wc -w /etc/passwd

字节数 : wc -c /etc/passwd

字符数 :wc -m /etc/passwd

最长行字节数 : wc -L /etc/passwd

注意:对西文字符来说,一个字符就是一个字节,但对中文字符一个汉字是大于两个字节的,具体数目由字符编码决定的。

结合管道: 统计 /etc 下面所有的目录数 :
ls -dl /etc/*/ | wc -l

@sort 排序命令:

将输入按照一定的方式排序,然后输出,支持的排序有:按字典排序,数字排序,月份排序,随机排序,反转排序,指定字段排序等。

默认为字典排序 :
cat /etc/passwd | sort

反转排序 :
cat /etc/passwd | sort -r

按照特定字段排序 :
cat /etc/passwd | sort -t’:’ -k 3

-t 参数用于指定字段的分隔符,这里以 “:“ 作为分隔符; -k 字段号用于指定对哪一个字段进行排序。这里/etc/passwd 文件的第三个字段为数字,默认情况下式以字典排序,如果要按照数字排序就加上 -n 参数 :
cat /etc/passwd | sort -t’:’ -k 3 -n

@uniq 去重命令

可以用于过滤或者输出重复行

  • 过滤重复行

可以使用history 命令查看最近执行过的命令(实际读取 ${SHELL}_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

输出所有重复的行:
history | cut -c 8- | cut -d ’ ’ -f 1 | sort | uniq -D

在Linux中下载图片 :wget 网址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值