Think before you speak, read before you think.

awk使用方法

by

in

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;}' 

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *