bash命令执行时会输出数据,如果这些数据必需经过几道手续之后才能得到我们想要的格式,应该如何设定?这就涉及到管线命令的问题(pipe)。管线命令使用的是“|”界定符号。
假设,我们需要读取last指令中root的登入的次数,步骤如下:
- 执行last,将这个月所有人的所有登入数据取出来;
- 使用grep将上面输出数据中的root截取出来,其他的不要;
- 使用wc这个可以计算行数的指令对上一步所获得的数据进行计算。
整个命令可以写成:last | grep root | wc -l
注意:管线命令“|”仅能处理由前一个命令所传来的正确数据,对于错误信息没有直接处理能力。每个管线部分都是指令,前一个指令的输出是后一个指令的输入。
常用的管线指令:
参数说明:
-d(delimiter) : 后面接的是分隔符,默认是空格符;
-c(character) : 后面接的是第几个字符;
-f(fields) : 后面接的是第几个字段;
范例:
cat /etc/passwd | cut -d ":" -f 1 将passwd文件中每一行里的“:”作为分隔符,列出第一个字段,即用户姓名
last | cut -d " " -f 1 以空格符作为分隔,列出文件中每一行的第一个字段
last | cut -c 1-20 将last得到的数据,每一行第1-20个字符取出来
总结:cut一般常用来分析日志文件。cut主要的用途是将同一行里的数据进行分解,最常用在分析一些数据或文字数据的时候,因为需要以某些字符作为分隔参数,然后将数据进行切割,以取得所需要的数据。
-t 分隔符: 使用分隔符隔开不同的区块,默认是tab;
+start -end: 有start区块排序到end区块;
-n: 使用纯数字排序,否则会以字母方式排序;
-r: 反向排序;
-u: 相同出现的一行,只列出一次
范例:
cat /etc/passwd | sort 将列出来的个人帐号排序
cat /etc/passwd | sort -t: +2n 将个人帐号以用户ID排序(每一行第1个字段序号为0,序号为2的表示第3个字段,即用户ID)
cat /etc/passwd | sort -t: +2nr 将个人帐号以用户ID反向排序
总结:当我们需要比较信息时可以用sort,比如,假设有很多帐号,想知道最大的用户ID是多少,用sort即可知道答案。
参数说明:
-l: 多少行;
-m: 多少字符;
-w:多少字(这里:以分隔符隔开的算一个字);
总结:wc是一个计算文件内容的工具组。例如,当需要知道账号文件中有多少个帐号时,可以使用wc -l,因为/etc/passwd文件中,一行代表一个用户;需要计算一个文件有多少个字符时,可以使用wc -m。
范例:
last | cut -d " " -f1 | sort | uniq
该指令用来删除重复的行从而只显示一条数据。例如,想要知道这个月登入主机的用户有哪些,而不在乎其登入次数,即可采用上面的指令:(1)先列出所有的数据;(2)将人名单独列出来;(3)排序;(4)删除重复的数据只显示一个。
范例:
last | tee last.list | cut -d " " -f1
在命令重定向时,如果将数据重定向到文件,屏幕上就不会出现任何数据。如果需要将数据同时显示在屏幕上和文件中,此时可用tee指令。例如,上面的指令,last可以查到这个月的登入数据,使用tee之后,会将这些数据传给下一个指令,并且会将数据写入到last.list文件中。
参数说明:
-d : 删除其后接的字符串;
-s : 取代重复的字符串;
范例:
last | tr '[a-z]' '[A-Z]' 将小写的a-z替改成大写
cat /etc/passwd | tr -d : 删除/etc/passwd文件中的“:”符号
cat /home/test/dostext | tr -d '\r' >dostext-noM 将dostext文件中行尾符号^M删除
总结:该指令可用于正规表达法中,因为它也是以正规表达法方式取代数据。以上面的例子作说明,使用[]可以设定一串字符,也常常用它来取代文件中的怪异符号。比如第3个例子,可用它来去除DOS文件中留下来的^M断行符。
语法:
split [bl] 输入文件(需要分隔的文件) 输出文件(分隔以后的文件的文件名前缀)
参数说明:
-b : 以文件size来分;
-l : 以行数来分
范例:
split -l 5 /etc/passwd test 会产生testaa,testab,testac等分隔后的文件
总结:split指令用来分隔文件,可将文件根据大小或行数分隔成任意大小,方便复制。