shell命令之awk详解

1.命令格式


awk [-F | -f | -v ] 'BEGIN {} // {command1;command2} END {}' file
-F      指定分隔符
-f      调用脚本
-v      定义变量
''      引用代码块
BEGIN   初始化代码块
//      匹配代码块,可以是字符串或正则表达式
{}      命令代码块,包含一条或多条命令
;       多条命令使用分号分隔
END     结尾代码块

2.特殊参数说明


$0                  表示整个当前行
\t                  制表符
\n                  换行符
~                   匹配,与==相比不是精确比较
!~                  不匹配,不精确比较
-F'[:#/]'           定义三个分隔符
ARGC                命令行参数个数
ARGV                命令行参数排列
ENVIRON             支持队列中系统环境变量的使用
FILENAME            awk浏览的文件名
FNR                 浏览文件的记录数
FS                  设置输入域分隔符,等价于命令行 -F选项
NF                  浏览记录的域的个数
NR                  已读的记录数
OFS                 输出域分隔符
ORS                 输出记录分隔符
RS                  控制记录分隔符

3.实用脚本


获取网卡ip
ipaddr=$(ifconfig eth0 | grep "broadcast" | awk '{print $2}')

查看普通用户及其使用的shell
cat /etc/passwd |awk -F: 'BEGIN {print "NAME\tSHELL"} $3>=1000 && $7=="/bin/bash" {print $1"\t"$7}'

查看内存使用百分比
use=$(free -m |grep Mem: |awk '{print $3}')
total=$(free -m |grep Mem: |awk '{print $2}')
useper=$(expr $use \* 100 / $total)
echo -e "\033[42;31m${useper}%\033[0m"

以空格为分隔,显示每行有多少字段
awk '{print NF}' file

以空格为分隔,查看文件中字段数大于4的行
awk 'NF>4 {print}' file

显示每一行行号
awk '{print NR,$0}'  file

不显示第一行
route -n | awk 'NR!=1{print}'

匹配文件中包含root的行
awk -F: '/root/'  /etc/passwd

匹配文件中空行的行号
awk '{if($0~/^$/)print NR}' file

将passwd每行中所有的root修改为jacob显示至屏幕
awk -F: 'gsub(/root/,"jacob",$0) {print $0}' /etc/passwd

将passwd每行中第一个root修改为jacob显示至屏幕
awk -F: 'sub(/root/,"jacob",$0) {print $0}' /etc/passwd

显示test.txt文档每行的字符长度
awk '{print length()}'  test.txt