Shell过滤器的具体使用
我们己经知道,将几个命令通过管道符组合在一起就形成一个管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出。
简单地说,过滤器可以概括为以下两点:
- 如果一个Linux命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。
- 过滤器通常与Linux管道一起使用。
常用的被作为过滤器使用的命令如下所示:
命令 | 说明 |
---|---|
awk | 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。 |
cut | 用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。 |
grep | 用于搜索一个或多个文件中匹配指定模式的行。 |
tar | 用于归档文件的应用程序。 |
head | 用于读取文件的开头部分(默认是10行)。如果没有指定文件,则从标准输入读取。 |
paste | 用于合并文件的行。 |
sed | 用于过滤和转换文本的流编辑器。 |
sort | 用于对文本文件的行进行排序。 |
split | 用于将文件分割成块。 |
strings | 用于打印文件中可打印的字符串。 |
tac | 与cat命令的功能相反,用于倒序地显示文件或连接文件。 |
tail | 用于显示文件的结尾部分。 |
tee | 用于从标准输入读取内容并写入到标准输出和文件。 |
tr | 用于转换或删除字符。 |
uniq | 用于报告或忽略重复的行。 |
wc | 用于打印文件中的总行数、单词数或字节数。 |
接下来,我们通过几个实例来演示一下过滤器的使用。
在管道中使用awk命令
关于awk命令的具体用法,请大家自行学习,本节我们我们仅通过几个简单的实例来了解一下awk命令在管道中的使用。
实例1
查看系统中的所有的账号名称,并按名称的字母顺序排序。
[jb51.net]$awk-F:'{print$1}'/etc/passwd|sort adm apache avahi avahi-autoipd bin daemon dbus ftp games ...
在上例中,使用冒号:作为列分隔符,将文件/etc/passwd的内容分为了多列,并打印了第一列的信息(即用户名),然后将输出通过管道发送到了sort命令。
实例2
列出当前账号最常使用的10个命令。
[jb51.net]$history|awk'{print$2}'|sort|uniq-c|sort-rn|head 140echo 75man 71cat 63su 53ls 50vi 47cd 40date 26let 25paste
在上例中,history命令将输出通过管道发送到awk命令,awk命令默认使用空格作为列分隔符,将history的输出分为了两列,并把第二列内容作为输出通过管道发送到了sort命令,使用sort命令进行排序后,再将输出通过管道发送到了uniq命令,使用uniq命令统计了历史命令重复出现的次数,再用sort命令将uniq命令的输出按照重复次数从高到低排序,最后使用head命令默认列出前10个的信息。
实例3
显示当前系统的总内存大小,单位为KB。
[jb51.net]$free|grepMem|awk'{print$2}' 2029860
在管道中使用cut命令
cut命令被用于文本处理。你可以使用这个命令来提取文件中指定列的内容。
实例1
查看系统中登录Shell是“/bin/bash”的用户名和对应的用户主目录的信息:
[jb51.net]$grep"bin/bash"/etc/passwd|cut-d:-f1,6 root:/root mozhiyan:/home/mozhiyan
如果你对Linux系统有所了解,你会知道,/ctc/passwd文件被用来存放用户账号的信息,此文件中的每一行会记录一个账号的信息,每个字段之间用冒号分隔,第一个字段即是账号的账户名,而第六个字段就是账号的主目录的路径。
实例2
查看当前机器的CPU类型。
[jb51.net]$cat/proc/cpuinfo|grepname|cut-d:-f2|uniq Intel(R)Core(TM)i5-2520MCPU@2.50GHz
上例中,执行命令cat/proc/cpuinfo|grepname得到的内容如下所示:
[jb51.net]$cat/proc/cpuinfo|grepname modelname:Intel(R)Core(TM)i5-2520MCPU@2.50GHz modelname:Intel(R)Core(TM)i5-2520MCPU@2.50GHz modelname:Intel(R)Core(TM)i5-2520MCPU@2.50GHz modelname:Intel(R)Core(TM)i5-2520MCPU02.50GHz
然后,我们使用cut命令将上述输出内容以冒号作为分隔符,将内容分为了两列,并显示第二列的内容,最后使用uniq命令去掉了重复的行。
实例3
查看当前目录下的子目录数。
[jb51.net]$ls-l|cut-c1|grepd|wc-l 5
上述管道命令主要做了如下操作:
- 命令ls-l输出的内容中,每行的第一个字符表示文件的类型,如果第一个字符是d,就表示文件的类型是目录。
- 命令cut-c1是截取每行的第一个字符。
- 命令grepd来获取文件类型是目录的行。
- 命令wc-l用来获得grep命令输出结果的行数,即目录个数。
在管道中使用grep命令
grep命令是在管道中比较常用的一个命令。
实例1
查看系统日志文件中的错误信息。
[jb51.net]$grep-i"error:"/var/log/messages|less
实例2
查看系统中HTTP服务的进程信息。
[jb51.net]$psauxwww|grephttpd apache189680.00.02647210404?SDec150:01/usr/sbin/httpd apache189690.00.0255288308?SDec150:01/usr/sbin/httpd apache189700.00.02659610524?SDec150:01/usr/sbin/httpd
实例3
查找我们的程序列表中所有命令名中包含关键字zip的命令。
[jb51.net]$ls/bin/usr/bin|sort|uniq|grepzip bunzip2 bzip2 bzip2recover gunzip gzip
实例4
查看系统安装的kernel版本及相关的kernel软件包。
[jb51.net]$rpm-qa|grepkernel kernel-2.6.18-92.e15 kernel-debuginfo-2.6.18-92.e15 kernel-debuginfo-common-2.6.18-92.e15 kernel-devel-2.6.18-92.e15
实例5
查找/etc目录下所有包含IP地址的文件。
[jb51.net]$find/etc-typef-execgrep'[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*'{}\;
在管道中使用tar命令
tar命令是Linux系统中最常用的打包文件的程序。
实例1
你可以使用tar命令复制一个目录的整体结构。
[jb51.net]$tarcf-/home/mozhiyan|(cd/backup/;tarxf-)
实例2
跨网络地复制一个目录的整体结构。
[jb51.net]$tarcf-/home/mozhiyan|sshremote_host"(cd/backup/;tarxf-)"
实例3
跨网络地压缩复制一个目录的整体结构。
[jb51.net]$tarczf-/home/mozhiyan|sshremote_host"(cd/backup/;tarxzf-)"
实例4
检査tar归档文件的大小,单位为字节。
[jb51.net]$cd/;tarcf-etc|wc-c 215040
实例5
检查tar归档文件压缩为tar.gz归裆文件后所占的大小。
[jb51.net]$tarczf-etc.tar|wc-c 58006
实例6
检查tar归档文件压缩为tar.bz2归裆文件后所占的大小。
[jb51.net]$tarcjf-etc.tar|wc-c 50708
在管道中使用head命令
有时,你不需要一个命令的全部输出,可能只需要命令的前几行输出。这时,就可以使用head命令,它只打印命令的前几行输出。默认的输出行数为10行。
实例1
显示ls命令的前10行输出。
[jb51.net]$ls/usr/bin|head addftinfo afmtodit apropos arch ash awk base64 basename bash bashbug
实例2
显示ls命令的前5行内容。
[jb51.net]$ls/|head-n5 bin cygdrive Cygwin.bat Cygwin.ico Cygwin-Terminal.ico
在管道中使用uniq命令
uniq命令用于报告或删除重复的行。我们将使用一个测试文件进行管道中使用uniq命令的实例讲解,其内容如下所示:
[jb51.net]$cattestfile Thislineoccursonlyonce. Thislineoccurstwice. Thislineoccurstwice. Thislineoccursthreetimes. Thislineoccursthreetimes. Thislineoccursthreetimes.
实例1
去掉输出中重复的行。
[jb51.net]$sorttestfile|uniq Thislineoccursonlyonce. Thislineoccursthreetimes. Thislineoccurstwice.
实例2
显示输出中各重复的行出现的次数,并按次数多少倒序显示。
[jb51.net]$sorttestfile|uniq-c|sort-nr 3Thislineoccursthreetimes. 2Thislineoccurstwice. 1Thislineoccursonlyonce.
在管道中使用wc命令
wc命令用于统计包含在文本流中的字符数、单同数和行数。
实例1
统计当前登录到系统的用户数。
[jb51.net]$who|wc-l
实例2
统计当前的Linux系统中的进程数。
[jb51.net]$ps-ef|wc-l
到此这篇关于Shell过滤器的具体使用的文章就介绍到这了,更多相关Shell过滤器内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!