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 后有一个空格