awk

awk变量

  变量:内置和自定义变量

  FS:输入字段分隔符,默认为空白字符

     awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd

     awk –F: '{print $1,$3,$7}’ /etc/passwd

   OFS:输出字段分隔符,默认为空白字符

     awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd

   RS:输入记录分隔符,指定输入时的换行符 

    awk -v RS=' ' ‘{print }’ /etc/passwd

  ORS:输出记录分隔符,输出时用指定符号代替换行符

    awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd

  NF:字段数量

    awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$

    awk -F: '{print $(NF-1)}' /etc/passwd

    NR:记录号

    awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab

  FNR:各文件分别计数,记录号

    awk '{print FNR}' /etc/fstab /etc/inittab

  FILENAME:当前文件名

    awk '{print FILENAME}’ /etc/fstab

  ARGC:命令行参数的个数

    awk '{print ARGC}’ /etc/fstab /etc/inittab

    awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab

  ARGV:数组,保存的是命令行所给定的各参数

    awk ‘BEGIN {print ARGV[0]}’ /etc/fstab  /etc/inittab

    awk ‘BEGIN {print ARGV[1]}’ /etc/fstab  /etc/inittab

自定义变量(区分字符大小写)

  (1) -v var=value

  (2) 在program中直接

  示例:

    awk -v test='hello gawk' '{print test}' /etc/fstab

    awk -v test='hello gawk' 'BEGIN{print test}'

    awk 'BEGIN{test="hello,gawk";print test}' 

    awk –F:‘{sex=“male”;print $1,sex,age;age=18}’  /etc/passwd

格式化输出:printf “FORMAT”, item1, item2, ...

  (1) 必须指定FORMAT  

  (2) 不会自动换行,需要显式给出换行控制符,

  (3) FORMAT中需要分别为后面每个item指定格式符

格式符:与item一一对应

  %c: 显示字符的ASCII码

  %d, %i: 显示十进制整数
  %e, %E:显示科学计数法数值
  %f:显示为浮点数
  %g, %G:以科学计数法或浮点形式显示数值
  %s:显示字符串
  %u:无符号整数
  %%: 显示%自身

修饰符:

  #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
  -: 左对齐(默认右对齐) %-15s
  +:显示数值的正负符号 %+d

逻辑操作符:与&&,或||,非!

示例:

  awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd

  awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd

  awk -F: ‘!($3==0) {print $1}' /etc/passwd

  awk -F: ‘!($3>=500) {print $3}’ /etc/passwd

函数调用: function_name(argu1, argu2, ...)

条件表达式(三目表达式):

  selector?if-true-expression:if-false-expression

  示例:

    awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s ",$1,usertype}' /etc/passwd

awk '!arr[$0]++'   file    文件内的行去重

awk '{ip[$1]++}END{for(i in ip)print i ip[i]}  /var/log/httpd/access_log    统计每个IP连接的次数

ss -nt | awk -F "[ :]+" '/ESTAB/{print $(NF-2)}' |sort | uniq -c |sort -nr |head -n3|while read count ip;do

>iptables -A INPUT -s $ip -j REJEACT;done

或者:

ss -nt |awk -F "[ :]+" '/ESTAB/{IP[$(NF-2)]++}END{for(i in IP){if(IP[i]>3)system("iptables -A INPUT -s "i" -j REJECT")}}'

将连接数超过3个的连接加入防火墙拒绝名单

while read count ip    这里出现两个变量,分别对应里面的计数和IP地址,如果需要while read后面可以加更多的变量

netstat -tan| awk '/^tcp>/{split($5,ip,":");count[ip[1]]++}END{for(i in count)print i,count[i]}'

awk '{for(i=1;i<=NF;i++)word[$i]++}END{for(i in word)print word[i],i}' /etc/profile|sort -nr

awk '{num[$3]++;sum[$3]+=$2}END{for(sex in num){print sex,num[sex],sum[sex]/num[sex]}}' f1 

[root@192 ~]# cat f1
mage 100 male
wang 90 male
zhang 85 female
mo 99 female

num[$3]++ 统计出现次数
sum[$3]+=$2 统计男性和女性各自的总分
print sex 打印 male或female
print num[sex] 打印各有几个男性和女性
print sum[sex]/num[sex]}}' 打印平均分

awk 'BEGIN{name="mage";system("echo "name)}'         name为awk的变量,不能和echo 在一个双引号下,注意!!echo 后有一个空格

原文地址:https://www.cnblogs.com/tony3154/p/10110748.html