awk
grep 文本过滤工具
sed 非交互文本编辑工具
awk 文本报告工具
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
基本语法
awk [option]... 'script' FILE...
awk [option]... '/PATTERN/{action}' FILE...
输出动作介绍:
print的使用格式:print item1, item2, ...
要点:(1)各项目之间使用逗号隔开,而输出时则以空白字符分隔;
(2)输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;
(3)print命令后面的item可以省略,此时其功能相当于print $0, 因此,如果想输出空白行,则需要使用print ""
awk内置变量:
NF:Numbers of Field,字段数
FS:Field Seperator, 输入分隔符(默认是空白字符)
OFS: Output Field Seperator, 输出时的字段分隔符,使用时要用双引号括起
# vim f1
this is a book
(空格)
hello my name is zhangsan
# awk '{print $1}' f1(默认分隔符是空格,$0 表示整行)
# awk '{print $1,$2}' f1(显示两列)
# awk '{print $NF}' f1(显示最后一列)
# awk '{print $((NF-1))}' f1(显示倒数第2列)
awk: (FILENAME=f1 FNR=2) fatal: attempt to access field -1
错误原因:f1文件中间一行为空行,删除即可。
# awk -F: '{print $1,$3,$NF}' /etc/passwd(-F指定分隔符为冒号)
# awk -F: '{print $1,"\t"$3,"\t"$NF}' /etc/passwd(输出时列与列之间用\t分割)
# awk -v FS=: '{print $1,"\t"$3,"\t"$NF}' /etc/passwd
-v表示申明一个变量,FS为内置变量,把其值赋为冒号
# awk -v FS=: -v OFS="\t" '{print $1,$3,$NF}' /etc/passwd(OFS指定输出分隔符)
格式化输出使用printf
printf命令的使用格式:printf format, item1, item2,...
要点:(1)其与print命令的最大不同是,printf需要指定format;
(2)format用于指定后面的每个item的输出格式;
(3)printf语句不会自动打印换行符\n
%s: 显示字符串
在输出格式上常用修饰符:
N: 显示宽度;
-: 左对齐(默认为右对齐);
+:显示数值符号
# awk -v FS=: '{printf "%-20s%-10s%s\n",$1,$3,$NF}' /etc/passwd
# awk -v FS=: '{printf "%-20s%-10s%s\n",$1,$3,$NF > "/root/awk.txt" }' /etc/passwd(把输出结果重定向到指定文件,文件名要用双引号引起)
awk支持算术、逻辑运算
# awk -v FS=: '$3>=500 && $3<65534 {printf "%-20s%-10s%s\n",$1,$3,$((NF-1))}' /etc/passwd
支持正则表达式
# awk -v FS=: '/^root\>/ {printf "%-20s%-10s%s\n",$1,$3,$((NF-1))}' /etc/passwd
# awk -F: '/111/,/222/ {print $0}' f1
作业:使用kickstart批量安装Linux后,所有主机的主机名都相同,要求更改主机名为“stationxxx”,其中xxx为本机获得的IP地址的最后一部分,并且把网卡的IP地址由dhcp动态获得改成静态IP地址。写一脚本实现这些功能。
# ifconfig eth0
# ifconfig eth0 | grep -i inet
inet addr:192.168.80.100 Bcast:192.168.80.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe5e:e2a9/64 Scope:Link
# ifconfig eth0 | grep -i "inet\>"(词尾锚定)
inet addr:192.168.80.100 Bcast:192.168.80.255 Mask:255.255.255.0
# ifconfig eth0 | grep -i "inet\>" | awk '{print $2}'
addr:192.168.80.100
# ADDR=`ifconfig eth0 | grep -i "inet\>" | awk '{print $2}'`
# echo $ADDR
# echo ${ADDR##*.} (从左边开始截,截取到最后一个点号,然后把左边的都扔掉)
100
改主机名要修改/etc/sysconfig/network文件。
浙公网安备 33010602011771号