Linux - awk 文本处理工具三

AWK 文件打印匹配 格式示例

awk '/Tom/' file               # 打印匹配到得行
awk '/^Tom/{print $1}'         # 匹配Tom开头的行 打印第一个字段
awk '$1 !~ /ly$/'              # 显示所有第一个字段不是以ly结尾的行
awk '$3 <40'                   # 如果第三个字段值小于40才打印
awk '$4==90{print $5}'         # 取出第四列等于90的第五列
awk '/^(no|so)/' test          # 打印所有以模式no或so开头的行
awk '$3 * $4 > 500'            # 算术运算(第三个字段和第四个字段乘积大于500则显示)
awk '{print NR" "$0}'          # 加行号
awk '/tom/,/suz/'              # 打印tom到suz之间的行
awk '{a+=$1}END{print a}'      # 列求和
awk 'sum+=$1{print sum}'       # 将$1的值叠加后赋给sum
awk '{a+=$1}END{print a/NR}'   # 列求平均值
awk '!s[$1 $3]++' file         # 根据第一列和第三列过滤重复行
awk -F'[ :\t]' '{print $1,$2}'           # 以空格、:、制表符Tab为分隔符
awk '{print "'"$a"'","'"$b"'"}'          # 引用外部变量
awk '{if(NR==52){print;exit}}'           # 显示第52行
awk '/关键字/{a=NR+2}a==NR {print}'      # 取关键字下第几行
awk 'gsub(/liu/,"aaaa",$1){print $0}'    # 只打印匹配替换后的行
ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}'             # 提取时间,空格不固定
awk '{$1="";$2="";$3="";print}'                        # 去掉前三列
echo aada:aba|awk '/d/||/b/{print}'                    # 匹配两内容之一
echo aada:abaa|awk -F: '$1~/d/||$2~/b/{print}'         # 关键列匹配两内容之一
echo Ma asdas|awk '$1~/^[a-Z][a-Z]$/{print }'          # 第一个域匹配正则
echo aada:aaba|awk '/d/&&/b/{print}'                   # 同时匹配两条件
awk 'length($1)=="4"{print $1}'                        # 字符串位数
awk '{if($2>3){system ("touch "$1)}}'                  # 执行系统命令
awk '{sub(/Mac/,"Macintosh",$0);print}'                # 用Macintosh替换Mac
awk '{gsub(/Mac/,"MacIntosh",$1); print}'              # 第一个域内用Macintosh替换Mac
awk -F '' '{ for(i=1;i<NF+1;i++)a+=$i  ;print a}'      # 多位数算出其每位数的总和.比如 1234, 得到 10
awk '{ i=$1%10;if ( i == 0 ) {print i}}'               # 判断$1是否整除(awk中定义变量引用时不能带 $ )
awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}'        # 列求最大值  设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束
awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}'    # 求最小值
awk '{if(A)print;A=0}/regexp/{A=1}'                    # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行
awk '/regexp/{print A}{A=$0}'                          # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行
awk '{if(!/mysql/)gsub(/1/,"a");print $0}'             # 将1替换成a,并且只在行中未出现字串mysql的情况下替换
awk 'BEGIN{srand();fr=int(100*rand());print fr;}'      # 获取随机数
awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}'       # 从第3行开始,每7行显示一次
awk '{if(NF<1){print i;i=0} else {i++;print $0}}'      # 显示空行分割各段的行数
echo +null:null  |awk -F: '$1!~"^+"&&$2!="null"{print $0}'       # 关键列同时匹配
awk -v RS=@ 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}'    # 指定记录分隔符
awk '{b[$1]=b[$1]$2}END{for(i in b){print i,b[i]}}'              # 列叠加
awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}'                 # 求余数
awk '{b=a;a=$1; if(NR>1){print a-b}}'                            # 当前行减上一行
awk '{a[NR]=$1}END{for (i=1;i<=NR;i++){print a[i]-a[i-1]}}'      # 当前行减上一行
awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}'   # END只打印最后的结果,END块里面处理数组内容
awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}'         # $2的总和  $2总和除个数(平均值)
awk -v a=0 -F 'B' '{for (i=1;i<NF;i++){ a=a+length($i)+1;print a  }}'     # 打印所以B的所在位置
awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' file        # 将date值赋给d,并将d设置为数组mon,打印mon数组中第2个元素
awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'      # 截取字符串(substr使用)
awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'      # 匹配字符串(index使用)
awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'    # 正则表达式匹配查找(match使用)
awk '{for(i=1;i<=4;i++)printf $i""FS; for(y=10;y<=13;y++)  printf $y""FS;print ""}'        # 打印前4列和后4列
awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}'                # 乘法口诀
awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'             # 字符串分割(split使用)
awk '{if (system ("grep "$2" tmp/* > /dev/null 2>&1") == 0 ) {print $1,"Y"} else {print $1,"N"} }' a            # 执行系统命令判断返回状态
awk  '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}'   # 将多行转多列
netstat -an|awk -v A=$IP -v B=$PORT 'BEGIN{print "Clients\tGuest_ip"}$4~A":"B{split($5,ip,":");a[ip[1]]++}END{for(i in a)print a[i]"\t"i|"sort -nr"}'    # 统计IP连接个数
cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt     # 处理sql语句
awk 'BEGIN{printf "what is your name?";getline name < "/dev/tty" } $1 ~name {print "FOUND" name " on line ", NR "."} END{print "see you," name "."}' file  # 两文件匹配

  

 

posted @ 2018-04-02 19:25  01234567  阅读(290)  评论(0编辑  收藏  举报