Linux文本处理—awk命令

awk是一个强大的文本分析工具,通过自定义字段分隔符、模式匹配和动作执行,实现对文本记录和字段的精细化操作。它可以处理输入文件,执行BEGIN和END模式,以及根据正则表达式进行模式匹配。例如,awk可以用来打印文件中的特定字段,或者根据逻辑条件筛选记录。在多文件处理中,BEGINFILE和ENDFILE分别在每个文件开始和结束时执行特定操作。
摘要由CSDN通过智能技术生成

作用:文本处理工具.

命令格式

awk Options 'Program-Text' InputFile1 InputFile2 ...

对输入文件 InputFile1 InputFile2 … 执行给定的程序 Program-Text.

常用选项

  • -F sep: 自定义字段分隔符为 sep.
  • -f ScriptFile: 从 ScriptFile 文件中读取 awk 脚本.

记录

默认的记录分隔符为换行符.

可以通过内建变量 RS 来自定义记录分隔符. RS 的值可以是单个字符,也可以是正则表达式.

如果将 RS 设为空字符串,则 awk 将以空白行来分割记录,且以换行符作为字段分隔符.

字段

awk 将每个记录分割为多个字段.

默认的字段分隔符是任意的空白符. 可以通过 -F 选项或 FS 内建变量来自定义字段分隔符.

FS 的值可以是单个字符,也可以是正则表达式.

如果 FIELDWIDTHS 变量被设置为以空格分隔的一系列数字,则每个字段将有对应数量的字符. 此时忽略 FS.

如果 FPAT 变量被设置为一个正则表达式,则每个字段将是匹配该正则的内容. FPAT 的优先级最低.

$0 代表整个记录、$1 代表记录中的第1个字段、$2 代表第2个字段、$11 代表第11个字段 … ($ 只用于引用字段,使用变量时,直接使用变量名即可)

NF 变量的值是当前记录中的字段数.

模式

Program-Text 为:

pattern {action1; action2; ...}

如果匹配模式,则执行指定的动作.

pattern 可以省略,此时将对每个记录执行给定的动作.

pattern 可以取值如下:

  • BEGIN: 在读取输入之前执行.

  • END: 在处理完所有输入之后执行.

  • BEGINFILE: 在读取每个输入文件之前执行.

  • ENDFILE: 在处理完每个文件之后执行.

  • /regular expression/: 只要记录匹配给定的正则表达式就执行.

  • 模式也支持逻辑运算:

    pattern && pattern
    pattern || pattern
    !pattern
    
  • pattern1, pattern2: 从匹配第一个模式的地方开始至匹配第二个模式的地方结束,包括首尾.

  • $n ~ /pattern/: 只要第 n 个字段匹配指定的模式就执行.

  • $n !~ /pattern/: 只要第 n 个字段不匹配指定的模式就执行.

例子

[ming@localhost test]$ cat /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[ming@localhost test]$ awk -F : '{print $1}' /etc/passwd | head -3
root
bin
daemon
[ming@localhost test]$ cat script.awk
BEGIN {
        print "Start Processing ..."
}

BEGINFILE {
        printf "Start Processing %s ...\n", FILENAME
}

{
        print $1
}

ENDFILE {
        printf "Finish Processing %s!\n", FILENAME
}

END {
        print "Finish Processing!"
}

[ming@localhost test]$ cat data1.txt 
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k
[ming@localhost test]$ cat data2.txt 
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k

[ming@localhost test]$ awk -f script.awk data1.txt data2.txt 
Start Processing ...
Start Processing data1.txt ...
1
a
Finish Processing data1.txt!
Start Processing data2.txt ...
1
a
Finish Processing data2.txt!
Finish Processing!

注意:模式必须和 { 位于同一行.

使用正则表达式:

[ming@localhost test]$ awk '/[a-z]/{print $1}' data1.txt 
a

[ming@localhost test]$ awk '!/[a-z]/{print $1}' data1.txt 
1

逻辑运算:

[ming@localhost test]$ cat data.txt 
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k
10 a 20 b 30 c

[ming@localhost test]$ awk '$1 ~ /[0-9]/ && $2 !~ /[0-9]/{print $1}' data.txt 
10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值