\
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)
来从大量文件中查找含有星号*
的文件与内容。
- 我们先来看如何在
/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
...
- 又是文件数量会太多,比如如果我们要找的是全系统
/
的话:
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。
处理的方式如下所示:
- 首先根据我们前面所讲的
ifconfig
、sed
与awk
来取得我们的IP:
root@orion-orion:~ ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *Bcast.*$//g'
addr:172.17.0.12
- 接着,我们可以将此命令利用
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
- 最终,我们可以通过变量设置来处理
MYIP
。
root@orion-orion:~ MYIP=$(myip)
root@orion-orion:~ echo $MYIP
addr:172.17.0.12
- 如果每次登陆都要生效,可以将
alias
与MYIP
设置的那两行写入你的~/.bashrc
即可。
参考
- [1] 鸟哥. 鸟哥的 Linux 私房菜: 基础学习篇(第四版)[M]. 人民邮电出版社, 2018.