设为首页 加入收藏

TOP

Linux:管道命令与文本处理三剑客(grep、sed、awk)(五)
2023-07-23 13:34:05 】 浏览:80
Tags:Linux 管道命 文本处 grep sed awk
\ NR >= 2 {total = $2 + $3 + $4; \ printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}' Name 1st 2nd 3th Total VBird 23000 24000 25000 72000.00 DMTsai 21000 20000 23000 64000.00 Bird2 43000 42000 41000 126000.00

第一种写法相较于第二种写法更好,因为比较有统一性。

除此之外,awk还可以帮我们进行循环计算,不过那属于比较高级的单独课程了,这里就不再多加以介绍。

5 习题

情景模拟题一

通过grep配合子命令$(command)来从大量文件中查找含有星号*的文件与内容。

  1. 我们先来看如何在/etc下面找出含有星号*的文件与内容。
root@orion-orion:~ grep '\*' /etc/* 2> /dev/null  
/etc/adduser.conf:#NAME_REGEX="^[a-z][-a-z0-9_]*\$"
/etc/bash.bashrc:#xterm*|rxvt*)
/etc/bash.bashrc:#*)
...

注意,这里单引号''内的型号是正则表达式的字符,但由于我们要找的是星号,因此需要加上转义符\;而/etc/*的那个*是bash通配符中的“万用字符”,在这里代表拥有任意多个字符的文件名。

不过在上述的这个例子中,我们仅能找到/etc下第一层子目录的数据,无法找到次目录的数据。如果想要连同完整的/etc此目录数据,就得要这样做:

root@orion-orion:~ grep '\*' $(find /etc -type f) 2> /dev/null
Binary file /etc/ld.so.cache matches
/etc/xdg/xfce4/xinitrc:  for i in ${XDG_CONFIG_HOME}/autostart/*.desktop; do
/etc/xdg/xfce4/xinitrc: x|xno*)
/etc/xdg/xfce4/xinitrc: *)
...

如果只想列出文件名而不想列出内容的话,可以加个-l参数:

root@orion-orion:~ grep -l '\*' $(find /etc -type f) 2> /dev/null
/etc/ld.so.cache
/etc/xdg/xfce4/xinitrc
/etc/xdg/Thunar/uca.xml
/etc/skel/.bashrc
...
  1. 又是文件数量会太多,比如如果我们要找的是全系统/的话:
root@orion-orion:~ grep '\*' $(find / -type f) 2> /dev/null  

芜湖,一运行这个命令,由于要打印的东西太多,终端直接卡死。这下该如何是好呢?此时我们可以通过管道命令以及xargs来处理。比如,让grep每次仅能处理10个文件名,我们可以:

a. 先用find去找出文件;
b. 用xargs将这些文件每次丢10个给grep来作为参数处理;
c. grep实际开始查找文件内容;

所以整个做法会变成这样:

root@orion-orion:~ find / -type f 2> /dev/null | xargs -n 10 grep '\*'
Binary file /sbin/chcpu matches
Binary file /sbin/sulogin matches
Binary file /sbin/pivot_root matches
...

然而,从输出的结果看,数据量实在非常庞大,如果我们只想知道文件名的话也可以给grep加上-l参数:

root@orion-orion:~ find / -type f 2> /dev/null | xargs -n 10 grep -l '\*'
/sbin/chcpu
/sbin/sulogin
/sbin/pivot_root
...

情景模拟题二

使用管道命令配合正则表达式建立新命令与新变量。我们想要建立一个名为myip的新命令,这个命令能够将我系统的IP识别出来并显示。而且我们想要有个新变量MYIP来记录我们的IP。

处理的方式如下所示:

  1. 首先根据我们前面所讲的ifconfigsedawk来取得我们的IP:
root@orion-orion:~ ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *Bcast.*$//g'
addr:172.17.0.12
  1. 接着,我们可以将此命令利用alias指定为myip,如下所示:
root@orion-orion:~ alias myip="ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' | \
\ sed 's/ *Bcast.*$//g'"
root@orion-orion:~ myip
addr:172.17.0.12
  1. 最终,我们可以通过变量设置来处理MYIP
root@orion-orion:~ MYIP=$(myip) 
root@orion-orion:~ echo $MYIP
addr:172.17.0.12
  1. 如果每次登陆都要生效,可以将aliasMYIP设置的那两行写入你的~/.bashrc即可。

参考

  • [1] 鸟哥. 鸟哥的 Linux 私房菜: 基础学习篇(第四版)[M]. 人民邮电出版社, 2018.
首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇CentOS7---部署Tomcat和安装Jpress 下一篇linux vi命令详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目