懒散的人

导航

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文件。

 

posted on 2019-09-15 19:58  懒散的人  阅读(355)  评论(0)    收藏  举报