awk 命令在处理文本中的应用

awk命令在处理文本中很方便,最近总结了一些awk的具体应用。
1、awk参数介绍
先写一个常用命令:

     cat 4653_trans_out |awk -F',' '{print $0;}'
       -F',' 是文本中的每一行按逗号分割
       $0 是文本中的每一行
       $1 是文本中每一行切割后的第一个字段
  awk内置变量介绍:
         记录变量:
             FS: field separator,读取文本时所使用的字段分隔符
             RS: Record separator,读取文本信息所使用的换行符
             OFS: Output Filed Separator: 输出文本时使用的字段分隔符
             ORS:Output Row Separator:输出文本时使用的行分隔符
         数据变量:
             NR: The number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处     理的多个文件中行统一计数;
             NF:Number of Field,当前记录的field个数;
             FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;
             ARGV: 数组,保存命令行本身这个字符串,如awk '{print $0}' a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
             ARGC: awk命令的参数的个数;
             FILENAME: awk命令所处理的文件的名称;
             ENVIRON:当前shell环境变量及其值的关联数组;
    awk自定义变量:
            awk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头
            实例:
            awk 'BEGIN{var="variable testing";print var}'
            awk -v var="variable testing" 'BEGIN{print var}'

2、awk中的编程语句
(1、awk中if的应用
实例命令如下:

cat 4653_trans_out |awk -F',' '{ if(substr($5, 5) == "0446") {print $0;}}'
    实例的命令是如果文件中每一行第5个字段的后四位如果是0446 就输出这一行

(2、awk中while的应用
实例命令如下:

     awk -F: '{i=1;while (i<=NF){if (length($i)>=4) {print $i}; i++}}' /etc/passwd

(3、next
提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:

awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd

(4、awk中使用数组
实例如下:
array[index-expression]
index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。要遍历数组中的每一个元素,需要使用如下的特殊结构:
for (var in array) { statement1, … }
显示各个shell的个数和

awk -F: '{shell[$NF]++}END{for(A in shell) {print A,shell[A]}}' /etc/passwd
    删除数组变量:
            从关系数组中删除数组索引需要使用delete命令。使用格式为
            delete  array[index]

(5、awk中内置函数:
split(string, array [, fieldsep [, seps ] ])
功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从0开始的序列;
netstat -ant | awk ‘/:80>/{split($5,clients,”:”);IP[clients[1]]++}END{for(i in IP){print IP[i],i}}’ | sort -rn | head -50
length([string])
功能:返回string字符串中字符的个数;
substr(string, start [, length])
功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;
system(command)
功能:执行系统command并将结果返回至awk命令
systime()
功能:取系统当前时间
tolower(s)
功能:将s中的所有字母转为小写
toupper(s)
功能:将s中的所有字母转为大写
(6、awk自定义函数
awk的函数可以在引号中的任意地方定义,用{}括起即可,可以定义参数,但调用时可带可不带:
如:显示每行前两个域的较大值的函数如下:

    1.  awk '
            2.  function max(a,b,c)
            3.  {
            4.  return a>b?a:b
            5.  }
            6.  {print max($1,$2)}' file
    说明:显示每行前两个域的较大值,max为函数名,a、b为参数,(类似于c语言的形参)

3、awk的模式

awk 'program' input-file1 input-file2 

其中的program为:
pattern { action }
pattern { action }
常见的模式类型:
(1、Regexp: 正则表达式,格式为/regular expression/
例如:显示以r开头的行

    awk -F: '/^r/{print $1}' /etc/passwd
(2、expresssion:表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo/ 或 $1 == "magedu",用运算符~(匹配)和~!(不匹配)。
        例题:
            显示id号小于等于5的用户和id号
awk -F: '$3-1<5{print $1,$3}' /etc/passwd
awk -F: '$3<=5{print $1,$3}' /etc/passwd
            取出默认shell为bash的用户
awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd
            显示默认shell不是bash的用户
awk -F: '$7!~"bash"{print $1,$7}' /etc/passwd

(3、Ranges: 指定的匹配范围,格式为pat1,pat2
显示id号为0或者shell为/sbin/nologin的用户

 awk -F: '$3==0,$7~"nologin"{print $1,$3,$7}' /etc/passwd

(4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

awk -F: '$3==0,$7~"nologin"{printf "%-10s%-20s\n",$1,$7}' /etc/passwd
        可以在显示时显示表头
awk -F: 'BEGIN{print "Username shell"}{printf "%-10s%-20s\n",$1,$7}' /etc/passwd
        显示表头和表尾
 awk -F: 'BEGIN{print "Username  shell"} {printf "%-10s%-20s\n",$1,$7}END
          {print "END OF report"}' /etc/passwd

(5、Empty(空模式):匹配任意输入行,对文件中的每一行做匹配

 awk -F:  '{printf "%-10s%-20s\n",$1,$7}' /etc/passwd

awk 更改源文件内容
源文件内容如下:

li      120     abc
wang    500     bcd
zhng    180     abc

给第一列为zhng的行的第二列加上200

     awk -F'\t' '$1 ~ /zhng/{$2 += 200}1' test.txt 1<> test.txt 

运行结果:

li  120 abc
wang    500 bcd
zhng 380 abc

awk 直接覆盖源文件内容

awk '{print "today is good day"}' test.txt | tee test.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值