awk算是一门很强大的语言,这里只有常用的一些命令
awk 的特性
- awk 能按行,列读取文件
- 和其他语言一样,有变量,条件,循环
- 有计算和字符串操作
- 可以生成格式化的输出
语法要注意
awk '/search pattern1/ {Actions} /search pattern2/ {Actions}' file
- search 可以是正则表达式
- action 为要执行的动作
- 程序中间要用单引号引起来
匹配符
~ 匹配
!~ 不匹配
特殊变量
NF 字段个数
NR 记录个数(行数)
FS filed separator
awk取出指定行,如第20行
cat /etc/hosts | awk 'NR==20'
awk取出偶数行
awk 'NR % 2 == 0' /etc/passwd
awk取出有3列的行
cat /etc/hosts | awk 'NF==3'
打印出指定列
cat /etc/hosts | awk '{print $2}'
打印出最后一列,列的长度参差不齐,也是打印最后一列
cat /etc/hosts | awk '{print $NF}'
利用求余数的方法取出某文件的随机一行
countline=`cat swapfile | wc -l` awk "NR==$(($RANDOM%$countline))" swapfile
指定分隔符为=号
awk -F '=' '{print $2}'
分析日志中 请求的 host 是 my.jpuyy.com 且 状态是200
tail -n 10 nginx_access.log | awk -F' ' '$2=="my.jpuyy.com" && $10==200 {print $10}'
$0代表了全部,打印全部 {print $0}
tail -n 10 nginx_access.log | awk -F' ' '$2=="my.jpuyy.com" && $10==200 {print $0}'
打印每一个filed
echo '11,13,15,61,3' | awk -F ',' '{for (i=1; i<=NF; i++) print $i}'
打印时与字会串拼接,用双引号引起来
echo '11,13,15,61,3' | awk -F ',' '{for (i=1; i<=NF; i++) print "192.168.1."$i}'
awk 与 grep 等价命令
cat my.log | grep error 等同于 awk '$0 ~ "error" {print $0}' my.log
使用 printf 打印指定格式
下面是取出 nginx log 中 GET 请求,把其中 $3, $9 以 , 分隔,并加上换行输出到 csv 中
cat nginx_access.log-20160410 | awk '$8=="GET" {printf "%s,%s\n", $3,$9}' >> nginx_access.log-20160410.csv
把指定列做加法,如最后一列
awk '{sum+=$NF} END {print sum}'
把最后一列踢除掉
awk '{$NF=""; print $0}' file
全部变为大写
awk '{print tolower($0)}'
全部变为小写
awk '{print toupper($0)}'
统计目录大小,包含 G 的目录
du -sh * | awk '$1 ~ /G/ { print }'
打印 hostname 前三个字符
hostname | awk '{print substr($0,1,3)}' hostname | cut -c 1-3 echo ${HOSTNAME:0:3}
奇数行和偶数行合并
awk 'NR%2==0 {print p" "$0;} NR%2 {p=$0;}'
Leave a Reply