一.格式化输出
1.print 为无格式输出语句:
print expr1,expr2,...,exprN print 语句显示每个表达式的串值,默认的ORS 和OFS 分别为\n 和Blank。 |
# ps -e | awk ‘/ tty5 / {print “tty05: ” $4}’看终端5的用户现在干什么 tty05: find |
2.printf 为格式化输出语句(用法同C语言)
printf format,expr1,expr2,...,exprN //format是规格说明,语法与C 语言类似 |
使用printf 时,不会自动输出ORS,必须自己在format 中使用\n 来显式地产生。 |
# awk 'BEGIN{printf "%f\n",999}' 以符点数显示结果999.000000 |
# echo "65" | awk '{printf "%c\n",$0}' 以ASCII码显示65即A awk 'BEGIN{printf "%c\n",65}' 以ASCII码显示65即A |
# awk ‘{printf “uname: %-8s ID: %6d\n”, $1, $3}’ employees uname: Tom ID: 4424 |
3.awk字符串连接与数字互转
awk中数据类型,是不需要定义,自适应的。 有时候需要强制转换。我们可以通过下面操作完成。
awk字符串转数字 $ awk 'BEGIN{a="100";b="10test10";print (a+b+0);}' 110 只需要将变量通过”+”连接运算。自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略。 |
awk数字转为字符串 $ awk 'BEGIN{a=100;b=100;c=(a""b);print c}' 100100 只需要将变量与””符号连接起来运算即可。 |
awk字符串连接操作 $ awk 'BEGIN{a="a";b="b";c=(a""b);print c}' ab $ awk 'BEGIN{a="a";b="b";c=(a+b);print c}' 0 字符串连接操作通”二“,”+”号操作符。模式强制将左右2边的值转为 数字类型。然后进行操作。 |
二.重定向和管道
#awk 'BEGIN {FS = ":"}{print $1 | "sort"}' /etc/passwd
三.流控语句(C 语言相似的流控)
1.条件语句
# awk '{if (NF > max) max = NF}END {print max}' 所有输入行之中字段的最大个数 |
# awk -F: '{if($2~/15026736523/) print $0}' list.txt 匹配第二域,并显示该记录 # awk -F: '{if($2=="15026736523")print $0}' list.txt 精确匹配$2的值 # awk -F: '{if($1 < $2) print $0}' list.txt 判断$1小于$2的记录并print # awk -F: '{if ($1~/360/ || $2 ~/150/)print $0}' list.txt 匹配任何一个,并集 # awk '{if (NR>0 && $1~/3605656/)print $0}' list.txt 匹配if条件 # awk 'BEGIN{var="200"} {if ($1<var) print $0}' list.txt 利用begin赋值 # awk '{if($1=="baoping"){$2=$2+1};print $2}' list.txt 算术运算 # awk '{if($1=="baoping") $2="1986";print $2}' list.txt 重新赋值并显示所有$2 # awk '{if($1=="baoping") {$2="1986";print $2}}' list.txt 重新赋值并显示单个$2 # awk '{if ($1<QQ) print $0}' QQ=360565687 list.txt 传递参数给awk使用 |
2.程序控制
3.循环(for循环中间隔符为“;”而不是“,”)
awk '{for(i=1;i<100;i++){if($i ~/UN=/){print $2"\t"substr($5,2)" "$8" "$i}}}' kkk.txt //使用标准风格的for语句 awk 'a=0;{for(i=1;i<=NF;i++)a+=$i;b=a/NF;print b}' 1.txt //求a.txt每行的平均值 awk '{for(i=1;i<=NF;i++)a[i]+=$i}{if(NR==3){for(i=1;i<=NF;i++){print a[i]/NR}}}' 1.txt //计算一列的平均值 |
一段文字,每两个单词之间有空格,让所有重复的单词只剩一个? 比如 ABC fff ddd ABC eee ABC 替换后只剩下第一个ABC。 #! /bin/awk -f { for (i = 1; i <= NF; i++) { ++word[$i] if (word[$i] == 1) printf(”%s “, $i) } printf(”\n”) } # chmod u+x t.sh # ./t.sh <your_file_name_here> |
四.本讲引用文件list.txt
54786542:13744232156 360565687:15026736523 360565687:13597572727 100000:13898754555 100000:13898754555 1510121:155554215544:TTTa baoping207 | 19862009 19862007 baoping2007 Malist dj121M112d12nmm tete |