Shell学习-15-Shell过滤器

114 篇文章 11 订阅
16 篇文章 0 订阅
3.4 Shell过滤器
  • 将几个命令通过管道符组合在一起就形成一个管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出。

  • 过滤器可以概括为以下两点:

    • 如果一个 Linux 命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。
    • 过滤器通常与 Linux 管道一起使用。
  • 常用的被作为过滤器使用的命令如下所示:

命令说明
awk用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。
cut用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。
grep用于搜索一个或多个文件中匹配指定模式的行。
tar用于归档文件的应用程序。
head用于读取文件的开头部分(默认是 10 行)。如果没有指定文件,则从标准输入读取。
paste用于合并文件的行。
sed用于过滤和转换文本的流编辑器。
sort用于对文本文件的行进行排序。
split用于将文件分割成块。
strings用于打印文件中可打印的字符串。
tac与 cat 命令的功能相反,用于倒序地显示文件或连接文件。
tail用于显示文件的结尾部分。
tee用于从标准输入读取内容并写入到标准输出和文件。
tr用于转换或删除字符。
uniq用于报告或忽略重复的行。
wc用于打印文件中的总行数、单词数或字节数。
  • 在管道中使用 awk 命令:查看系统中的所有的账号名称,并按名称的字母顺序排序。
[root@localhost testshell]# awk -F: '{print $1}' /etc/passwd |sort
adm
admin
bin
chrony
daemon
dbus
ftp
games
halt
lp
mail
mariadb
mysql
nobody
operator
。。。

使用冒号:作为列分隔符,将文件 /etc/passwd 的内容分为了多列,并打印了第一列的信息(即用户名),然后将输出通过管道发送到了 sort 命令。

  • 列出当前账号最常使用的 10 个命令。
[root@localhost testshell]# history |awk '{print $2}' |sort |uniq -c |sort -rn|head
    133 echo
    106 ll
     76 .
     59 cd
     53 vi
     49 clear
     44 cat
     31 touch
     30 mycat
     29 vim

在上例中,history 命令将输出通过管道发送到 awk 命令,awk 命令默认使用空格作为列分隔符,将 history 的输出分为了两列,并把第二列内容作为输出通过管道发送到了 sort 命令,使用 sort 命令进行排序后,再将输出通过管道发送到了 uniq 命令,使用 uniq 命令 统计了历史命令重复出现的次数,再用 sort 命令将 uniq 命令的输出按照重复次数从高到低排序,最后使用 head 命令默认列出前 10 个的信息。

  • 显示当前系统的总内存大小,单位为 KB。
[root@localhost testshell]# free | grep Mem
Mem:        1862788      522740     1005696        9820      334352     1183160
[root@localhost testshell]# free | grep Mem| awk '{print $2}'
1862788

  • 在管道中使用 cut 命令:cut 命令被用于文本处理。你可以使用这个命令来提取文件中指定列的内容。

  • 查看系统中登录 Shell 是“/bin/bash”的用户名和对应的用户主目录的信息:

[root@localhost testshell]# grep "/bin/bash" /etc/passwd |cut -d: -f1,6
root:/root
admin:/home/admin

/ctc/passwd 文件被用来存放用户账号的信息,此文件中的每一行会记录一个账号的信息,每个字段之间用冒号分隔,第一个字段即是账号的账户名,而第六个字段就是账号的主目录的路径。

  • 查看当前机器的CPU类型。
[root@localhost testshell]# cat /proc/cpuinfo | grep name |cut -d: -f2 |uniq
 Intel(R) Core(TM) i7-10870H CPU @ 2.20GHz
 
#执行命令cat /proc/cpuinfo | grep name得到的内容如下所示:
[root@localhost testshell]# cat /proc/cpuinfo |grep name
model name	: Intel(R) Core(TM) i7-10870H CPU @ 2.20GHz
#然后,我们使用 cut 命令将上述输出内容以冒号作为分隔符,将内容分为了两列, 并显示第二列的内容,最后使用 uniq 命令去掉了重复的行。
  • 查看当前目录下的子目录数。
[root@localhost testshell]# ls -l | cut -c 1 | grep d | wc -l
5
  • 上述管道命令主要做了如下操作:

    • 命令ls -l输出的内容中,每行的第一个字符表示文件的类型,如果第一个字符是d,就表示文件的类型是目录。
    • 命令cut -c 1是截取每行的第一个字符。
    • 命令grep d来获取文件类型是目录的行。
    • 命令wc -l用来获得 grep 命令输出结果的行数,即目录个数。
  • 在管道中使用grep命令:grep 命令是在管道中比较常用的一个命令。

  • 例子:

#查看系统日志文件中的错误信息。
grep -i "error:" /var/log/messages | less

#查看系统中 HTTP 服务的进程信息。
ps aux | grep httpd

#查找程序列表中所有命令名中包含关键字 zip 的命令
ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
gunzip
gzip

#查看系统安装的 kernel 版本及相关的 kernel 软件包。
[root@localhost testshell]# rpm -qa | grep kernel
kernel-tools-libs-3.10.0-1160.80.1.el7.x86_64
kernel-tools-3.10.0-1160.80.1.el7.x86_64
kernel-devel-3.10.0-1160.80.1.el7.x86_64
kernel-3.10.0-1160.80.1.el7.x86_64
kernel-3.10.0-1127.el7.x86_64
kernel-headers-3.10.0-1160.80.1.el7.x86_64

#查找 /etc 目录下所有包含 IP 地址的文件。
find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;
  • 在管道中使用 tar 命令:tar 命令是 Linux 系统中最常用的打包文件的程序。

  • 举例:

#使用 tar 命令复制一个目录的整体结构。
tar cf - /home/zk | ( cd /backup/; tar xf - )

#跨网络地复制一个目录的整体结构。
tar cf - /home/zk | ssh remote_host "( cd /backup/; tar xf - )"

#跨网络地压缩复制一个目录的整体结构。
tar czf - /home/zk | ssh remote_host "( cd /backup/; tar xzf - )"

#检査 tar 归档文件的大小,单位为字节。
cd /; tar cf - etc | wc -c

#检查 tar 归档文件压缩为 tar.gz 归裆文件后所占的大小。
tar czf - etc.tar | wc -c

#检查 tar 归档文件压缩为 tar.bz2 归裆文件后所占的大小。
tar cjf - etc.tar | wc -c
  • 在管道中使用 head 命令:不需要一个命令的全部输出,可能只需要命令的前几行输出。这时,就可以使用 head 命令,它只打印命令的前几行输出。默认的输出行数为 10 行。
#显示 ls 命令的前 10 行输出。
[root@localhost testshell]# ls /usr/bin | head
[
a2p
aclocal
aclocal-1.13
addr2line
alias
appletviewer
apropos
ar
arch

#显示 ls 命令的前 5 行内容。
[root@localhost testshell]# ls /usr/bin | head -n 5
[
a2p
aclocal
aclocal-1.13
addr2line

  • 在管道中使用 uniq 命令:uniq 命令用于报告或删除重复的行。
[root@localhost testshell]# cat os.txt
redhat
suse
centos
ubuntu
solaris
hp-ux
fedora
centos
redhat
hp-ux
#去掉输出中重复的行。
[root@localhost testshell]# sort os.txt|uniq
centos
fedora
hp-ux
redhat
solaris
suse
ubuntu
#显示输出中各重复的行出现的次数,并按次数多少倒序显示。
[root@localhost testshell]# sort os.txt| uniq -c|sort -rn
      2 redhat
      2 hp-ux
      2 centos
      1 ubuntu
      1 suse
      1 solaris
      1 fedora

  • 在管道中使用 wc 命令:wc 命令用于统计包含在文本流中的字符数、单词数和行数。

  • 举例:

#统计当前登录到系统的用户数。
who | wc -l
#统计当前的 Linux 系统中的进程数。
ps -ef | wc -l

参考文献:
Shell过滤器

下一篇:Shell学习-16-tree命令安装及使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值