博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk常见操作整理(更新)
阅读量:5141 次
发布时间:2019-06-13

本文共 4833 字,大约阅读时间需要 16 分钟。

awk的基本结构

awk 'BEGIN{} pattern {} END {}'#pattern {} 部分是针对每行进行循环处理的,有pattern表示对匹配到的行处理,没有pattern表示对所有行处理 [root@test88 etc]# echo -e "line1\nline2" | awk 'BEGIN {print "Start"} {print} END {print "End"}'Startline1line2End[root@test88 etc]# echo | awk '{var1="v1";var2="v2";var3="v3";print var1,var2,var3;}'  // ,表示用空格分割v1 v2 v3[root@test88 etc]# echo | awk '{var1="v1";var2="v2";var3="v3";print var1"-"var2"-"var3;}'  //  "" 用于拼接字符串v1-v2-v3

 awk内置变量

 NR 当前行的记录数,即行号
   NF 当前行的字段数目
   FS 字段分隔符
   $0 整行文本
   $1 第一个字段
   $2 第二个字段
[root@test88 etc]# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line no:"NR",No of fields:"NF,"$0="$0,"$1="$1,"$2="$2,"$3="$3}'Line no:1,No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3Line no:2,No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5Line no:3,No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

 可以用$NF表示最后一个字段

[root@test88 etc]# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $NF}' // 可以用$NF表示最后一个字段f3f5f7

 可以用NR统计行数

[root@test88 etc]# awk 'END{print NR}' file   //统计行数

 使用awk进行简单的累加

[root@test88 etc]# seq 5 | awk 'BEGIN {sum=0;print "Summation:"}{print $1"+";sum+=$1}END{print "==";print sum}'Summation:1+2+3+4+5+==15

 将外部变量传进awk

[root@test88 etc]# VAR=100000[root@test88 etc]# echo | awk -v VARIABLE=$VAR '{print VARIABLE}'  // 使用外部变量100000[root@test88 etc]# var1="Variable1";var2="Variable2"[root@test88 etc]# echo | awk '{print v1,v2}' v1=$var1 v2=$var2Variable1 Variable2[root@test88 etc]# awk '{print v1,v2}' v1=$var1 v2=$var2 filename [root@test88 ~]# awk '{print v1,v2}' v1=$var1 v2=$var2 /etc/hosts Variable1 Variable2 Variable1 Variable2 Variable1 Variable2 Variable1 Variable2

 匹配指定行进行操作

[root@test88 ~]# cat file.txt 12345linux linux winwin[root@test88 ~]# awk 'NR < 5' file.txt1234[root@test88 ~]# awk 'NR==1,NR==4' file.txt1234[root@test88 ~]# awk '/linux/' file.txtlinuxlinux win[root@test88 ~]# awk '!/linux/' file.txt12345win

 指定匹配分隔符

[root@test88 ~]# awk -F : '{print $NF}' /etc/passwd/bin/bash/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/bin/sync[root@test88 ~]# awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd/bin/bash/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/bin/sync

 使用getline获得命令的输出

[root@test88 ~]# echo | awk '{"grep root /etc/passwd"|getline cmdout;print cmdout}'  // getline获得命令输出并赋给cmdout变量,默认读取第一行输出root:x:0:0:root:/root:/bin/bash

 使用for循环

[root@test88 ~]# awk -F: '/root/{for(i=0;i<10;i++) {print $i}}' /etc/passwdroot:x:0:0:root:/root:/bin/bashrootx00root/root/bin/bash

 length(string)返回字符串长度

[root@test88 ~]# echo "linux" | awk '{print length($0)}'5

 index(string,search_string)返回目标字符串的位置

[root@test88 ~]# echo "linux" | awk '{print index($0,"i")}'2

 倒序打印

[root@test88 ~]# seq 9 | awk '{lifo[NR]=$0}END{for(lino=NR;lino>0;lino--){print lifo[lino];}}'  //把内容放入数组,结束后再倒着输出一遍987654321[root@test88 ~]# seq 9 | tac987654321

 提取IP地址

[root@test88 ~]# ifconfigeth0      Link encap:Ethernet  HWaddr 00:0C:29:D2:82:D9           inet addr:10.0.0.88  Bcast:10.0.0.255  Mask:255.255.255.0          inet6 addr: fe80::20c:29ff:fed2:82d9/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:20531 errors:0 dropped:0 overruns:0 frame:0          TX packets:12613 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000          RX bytes:26297973 (25.0 MiB)  TX bytes:768281 (750.2 KiB)[root@test88 ~]# ifconfig | awk -F "[ :]+" 'NR==2{print $4}'10.0.0.88

 awk脚本

关于awk脚本,我们需要注意两个关键词BEGIN和END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ cat score.txtMarry   2143 78 84 77Jack    2321 66 78 45Tom     2122 48 77 71Mike    2537 87 97 95Bob     2415 40 57 62

 我们的awk脚本如下:

$ cat cal.awk#!/bin/awk -f#运行前BEGIN {    math = 0    english = 0    computer = 0     printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"    printf "---------------------------------------------\n"}#运行中{    math+=$3    english+=$4    computer+=$5    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5}#运行后END {    printf "---------------------------------------------\n"    printf "  TOTAL:%10d %8d %8d \n", math, english, computer    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR}

 我们来看一下执行结果

$ awk -f cal.awk score.txtNAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL---------------------------------------------Marry  2143     78       84       77      239Jack   2321     66       78       45      189Tom    2122     48       77       71      196Mike   2537     87       97       95      279Bob    2415     40       57       62      159---------------------------------------------  TOTAL:       319      393      350AVERAGE:     63.80    78.60    70.00

 计算文件大小

[root@C ~]# ls -l *.txt | awk '{sum+=$5}END{print sum}'420

 筛选文本长度

#打印长度大于4的文本行[root@C ~]# awk 'length>4' test.txt liyongoldboy

转载于:https://www.cnblogs.com/Peter2014/p/7565614.html

你可能感兴趣的文章
jQuery on(),live(),trigger()
查看>>
【架构】Linux的架构(architecture)
查看>>
ASM 图解
查看>>
Date Picker控件:
查看>>
你的第一个Django程序
查看>>
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>