命令组合
- Linux中有着众多的命令,不同于直觉化的图形化窗口,我们并不能容易的理解Linux命令,但使用这些命令能让我们更接近系统底层调用的细节
- Linux命令较之于图形化窗口更加强大,而且在shell中我们可以组合使用Linux命令,发挥更强的作用
- 本文将借助一份示例来介绍一些简单的Linux命令组合
我的配置
- Linux版本:Linux Mint
- shell版本:zsh
示例
- 假设有文件1.txt记录着西邮Linux兴趣小组几位大佬们悲惨的成绩(图一乐)
zzw 环境编程 33
rzj 环境编程 55
lsh 网络编程 33
hzn 网络编程 55
zzy 数据结构 33
zt 计算机组成原理 55
lsh 计算机组成原理 55
zzy 计算机组成原理 55
xjj 数据结构 33
- 解释以下命令:
cat 1.txt | awk '{print $1}' | sort | uniq -c | sort -r -n | head -n 5
grep "rzj" > 2.txt < 1.txt
echo "the answer is 42" > 1.txt
SHOW
- 理解上面的命令对于Linux菜鸟是一种挑战,但我们可以一步一步的剖析以上命令,然后完全掌握它
- 首先我们通过vim命令建立一份与示例相同的文档,然后来逐步分析
第一条
cat 1.txt | awk '{print $1}' | sort | uniq -c | sort -r -n | head -n 5
首先,我们尝试一下执行此条命令,看看会发生什么
输出很奇怪,让我们来好好分析一下
管道
- 首先,我们会注意到多个命令之间是通过 ‘|’(管道符) 来连接的,‘|’即‘管道’,要理解这个复杂的命令,我们就要首先理解什么是管道
- 在前后两个命令通过管道相连后,就产生了输入输出上的连接
- 左侧命令向标准输入写入,右侧从标准输入读取,那么这两个命令就可以形成一个管道
- 管道命令只处理前一个命令的正确输出,不处理错误输出
- 管道也称管道重定向,与重定向(‘>’)有一些差别
每条命令仅提及所使用到的部分,不会详细讲述
cat
cat命令在man手册的定义为:
concatenate files and print on the standard output
此处仅使用了cat的基础用法
cat 1.txt
执行后效果为将1.txt的内容显示到标准输出也就是当前的shell中
awk
awk在man手册中名为gawk(gawk是awk的GUN实现),定义为:
pattern scanning and processing language
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
此处对awk的用法为
awk '{print $1}'
即每行按空格或TAB分割,输出文本中的1项
需要注意的是,从这里开始管道已经发挥作用,awk接受的正是cat的 标准 正确 输出
sort
man手册中对sort的定义为:
sort lines of text files
- 此处对sort的使用没有附加任何命令行参数,其作用为:
- 以默认的方式将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出(此处sort接受的输入依旧是前一个命令awk的标准正确输出,往后不再赘述)
uniq
mam手册中对uniq的定义为:
report or omit repeated lines
其-c(count)命令行参数定义为:
prefix lines by the number of occurrences
所以,对于uniq -c的理解并不难
sort -r -n
此处使用了sort的两个命令行参数
man手册对-r(reverse)的定义为:
reverse the result of comparisons
-n(numric-sort):
compare according to string numerical value
- -r就是反转排序,不难理解
- -n是按照数值排序,在此处也就是按照姓名前的数字大小排序,因为此处都是10以内的数字,所以并未凸显出-n的特性
- 若a的出现次数为10次,b为3次,如果不添加-n,就会出现3比10大的现象,因为sort此时只会关注两个数字的第一位,即3>1
head
终于来到最后一个命令
man手册对head的定义为:
output the first part of files
-n(lines NUM) 的定义为:
print the first NUM lines instead of the first 10;
with the leading '-',
print all but the last NUM lines of each file
由上可知
head -n 5为打印前五行
head -n -5为打印除后5行外全部内容
至此,我们已经可以理解第一条的全部内容,其重点为管道与文件处理
第二条
grep "rzj" > 2.txt < 1.txt
重定向
第二条相比于第一条简短了很多,但还是包含着奇怪的符号
- ‘>’ 与 ‘<’
这两个符号是重定向符号,与管道重定向类似,依旧是操作输入与输出
在此处该命令可视为
command > 2.txt < 1.txt
等同于
command < 1.txt > 2.txt
即使用command命令操作1.txt并将产生的副本输出到2.txt,1.txt的内容保持不变
grep
man手册对其定义为:
print lines that match patterns
关于grep的完整使用此处不做提及,针对此条定义我们已经可以理解第二条命令:
即在1.txt中寻找到包含特定字符的一行,并将获得的结果保存到2.txt
第三条
echo "the answer is 42" > 1.txt
man手册对echo的定义为:
display a lint of text
此处使用>输出重定向将echo的标准输出输入到了1.txt之中,覆写了1.txt的原有内容
(如果使用>>就不会覆写1.txt的内容,而是将echo的标准输出追加到1.txt的末尾)