管道命令
有时候,输出的数据太过繁杂,我们需要进行一些处理才能得到我们需要,这时候需要用到linux的管道命令。管道命令使用的是"|"这个界定符号。
管道命令不是"连续执行命令",实际上"|"仅仅只能处理经由前面的命令传来的正确信息(stdout),对于stderr没有直接的处理能力,直接忽略。
每个管道"|"后面接的第一个数据必须是命令,而且此命令必须能够接收stdin的数据(接收前一个命令传来的数据转为stdin),这样的命令才可以称之为管道命令,比如less,more,head,grep等。而 ls,mv等就不是管道命令了。
选取命令cut, grep
选取命令的作用:将一段数据经过分析后,取出我们想要的。通常分析选取数据是针对行来分析的,而不是整篇进行分析。
cut
功能:取出某段信息,其处理是以行为单位。
1、通过分隔字符来取出某一段
cut -d '分隔字符' -f [取出第几段]
举个例子
echo $PATH | cut -d ':' -f 3,5
意思就是,以":"为分隔符,然后列出第三个和第五个(第一个":"前面的数据算第一个)
2、取出某一段字符范围
cut -c [字符范围]
这个适合于输出数据是整齐的格式,比如说:export的输出数据是:
declare -x ****AAIIOA
declare -x ****A)A)
declare -x ****A)A)
declare -x *****(*(
若是我们不想要前面的那些共同信息,可以这样做
export | cut -c 12-
就是所有的行都是取出从第12个字符开始以后的数据。字符范围也可以是12-20这样的具体范围。
不过cut在处理多空格相连的情况时,会不太方便。
grep
功能:grep的作用是对数据进行一行行的分析,若是当中有我们需要的信息,就将该行整个都拿出来。
grep [-acinv] [--color=auto] '查找的字符串' [file or stdin]
-a:将binary文件以text文件的方式来查找数据;
-c:计算找到'查找的字符串'的次数;
-i:忽略大小写的不同;
-n:顺便输出行号;
-v:反向选择,显示不含有"查找的字符串"的那些行;
--color=auto:将找到的关键字部分加以颜色显示。
举例说明如下:
ls -al | grep 'root'
grep --color=auto 'openvswitch' /home/gavinzh/openwrt/Makefile
第一行是用作管道命令;第二行是直接作用于文件来寻找关键字。
排序命令sort、uniq、wc
排序命令可以对数据进行排序,统计。
sort
功能:可以排序,而且可以根据不同的数据类型来进行排序(比如说按照数字来排、按照文字来排)。
sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写不同;
-b:忽略最前面的空格部分;
-M:以月份的名字来排序(DEC,JAN等);
-n:使用“纯数字”来排序(默认是文字类型来排序);
-r:反向排序;
-u:就是uniq,相同的数据中仅出现一行;
-t:分隔符,默认是以tab来分隔;
-k:与-t搭配使用,分隔完后以"第几个区间"来进行排序。
举个例子:
cat /etc/passwd | sort
cat /etc/passwd | sort -t ':' -k 3 -n
第一行默认就是以第一个数据来排序,而且是以文字的方式来排序。
第二行中以":"分隔后,以第三区间来排序,由于默认是以文字类型来排序,所以加个 -n 参数来实现以数字方式来排序。
uniq
功能:其作用和sort的-c参数相同,是要将重复的数据仅列出一个来显示。
uniq [-ic]
-i:忽略大小写的不同。
-c:进行计数。
举个例子:
last | cut -d ' ' -f 1 | sort | uniq -c
last来查看这个月登陆主机的用户,经过cut后只显示用户名,然后sort进行排序,最后uniq去掉重复的数据(连续的几个重复的,而不是所有的里面所有的重复的),并对每个登录用户的次数进行统计。
由于uniq只是对连续的几个重复的才可以进行删除重复,所以我们要做的一般是先排序,再进行uniq。
wc
功能:统计文件或者输入流有多少字,多少行,多少字符。
wc [-lwm] [file or stdin]
-l:统计多少行;
-w:统计多少字(英文单字);
-m:统计多少字符。
举个例子:
cat /etc/config network | wc
last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
第一行默认是输出行数、字数、字符数。
第二行由于last会输出空白行和wtmp行,所以用grep依次过滤,最后统计一下行数,就可以知道这一个月内登陆这个系统的总人数。
双向重定向tee
不同于之前的重定向,tee命令可以实现在数据流输向屏幕的同时,也输出到文件或设备中。
tee [-a] filename
-a:以追加的方式,将数据写入filename中。
举个例子:
last | tee last.list | cut -d " " -f 1
将last的输出先存到last.list中一份,然后再做处理后在屏幕显示。
切割命令split
split命令可以将一个大文件依据大小或者行数来进行切割,弄成小文件;
split [-bl] file PREFIX
-b:按照大小来切割时,就接个b参数,后面跟b, k, m等;
-l:以行数来进行切割;
PREFIX:代表前导符,可作为切割文件的前导文字。
举个例子:
split -b 300k /etc/passwd passwd
切完之后,目录下就有几个passwdaa、passwdbb、passwdcc。前导是我们加的,aa、bb、cc是系统加的。
cat passwd* >> passwdback
利用数据流重定向就可以实现将几个文件来合成为一个文件。
ls -al / |split -l 10 - gavinzh
后边的那个"-"就是代表stdin,若是需要stdout /stdin时,但偏偏没有文件,就可以用"-"来代表stdin或stdout。之前的grep中可以省略"-",原因是其[file]是作为最后一个参数,默认都是前面的stdout作为stdin来进行处理。
关于这个"-"符号,再来看一个例子:
tar -cvf - /home | tar -xvf -
前一个命令的stdout作为下一个命令的stdin,而且这些命令需要用到文件名的时候,stdin和stdout可以用"-"来替代。
-cvf后面的那个 "-" 就代表压缩的输出流stdout(没有记录到文件,但是理解的时候可以视作把/home压缩后的一个压缩包文件名),后面的-xvf之后的 "-" 就代表前面的输出流作为这次的输入流stdin(理解的时候可以视作之前的压缩包文件名)。这样就不需要使用文件(文件名)了。
参数代换xargs
xargs可以读入stdin的数据,以空格或者断行符来进行分辨,最终将stdin数据分隔成arguments,传给某个命令。
xargs [-epn] cmd
-e:就是eof(end of file)的意思,后边可以接一个字符串,当xargs分析到这个字符串就会不会往下工作;
-p:执行每个命令时,询问用户的意思;
-n:接次数,每次cmd执行的时候,使用几个参数。
举个例子:
cd /home/gavinzh; ls | sort | head -n 3 | xargs ls -al
首先ls一下并进行排序,取出前三行,然后把这前三个作为参数传入ls -al命令。
cd /home/gavinzh; ls | sort | xargs -n 3 -p ls -al
这行命令中,我们每次传入ls -al 3个参数,并询问用户是否确定操作。
若是用到-e 参数,我们需要的是-e紧接着字符串,中间不能有空格。
xargs的一个作用就是,有许多命令并不是管道命令(不能接收stdin的数据直接处理),所以通过xargs可以提取stdin中的关键信息作为参数,传入这些非管道命令中。例如上面的 ls 本身就不是管道命令,通过xargs就可以传入参数。
评论