awk 命令可以用来过滤文本,简单理解就是对文本的每行执行命令awk指定的脚本.
基本命令格式如下:
awk [选项] '条件{编辑指令}' 文件
选项
-F
指定分隔符,可省略-F
(默认空格或Tab位)
处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。print是最常见的指令。
🐖 编辑指令如果包含多条语句时,可以用分号分隔, eg:
awk -F: '{$1="Description:"; print $0}' test.txt
eg:
cat test.txt
#
a:bb:ccc:d
1:2::@:4
# 运行命令,输出:
Description: bb ccc d
Description: 2 @ 4
🐖 -F:
指定“:”
为字段分隔符
数据字段变量
$0
表示整行文本
$1
表示文本行中第一个数据字段
$n
表示文本行中第n个数据字段
awk '{print NR}' 1.txt
🐖 只打印行号,不显示文本内容
🐖:NR
: Number of Record (记录数) ,$NR
暂时未明白??
打印每行的文本:
awk '{print $0}' 1.txt
打印每行,并为每行带上行号:
awk '{print NR":",$0}' 1.txt
🐖 NR : 表示记录数,在执行过程中对应于当前的行号
🐖 NR":",$0
是满足print
语法的写法
打印每行的第1列(默认用空格分离):
awk '{print $1}' 1.txt
打印每行的最后1列(默认用空格分离):
awk '{print $NF}' 1.txt
🐖 NF
: 表示字段数,NF: Number of Field (字段数)在执行过程中对应于当前的字段数。 $NF
:表示最后一个字段的内容 [从左往右]
打印每行的倒数第2列(默认用空格分离):
awk '{print $(NF-1)}' 1.txt
用awk打印除第一列之外的所有列
awk '{for(i=2;i<=NF;++i) print $i}' test.txt
或者awk '{for(i=2;i<=NF;++i) printf $i ;printf "\n"}' test.txt
🐖shell中的print和printf的区别:
- print按照默认的分隔符打印一个或多个变量或常量(字符串),末尾自动换行;
- printf可以格式化后输出每个变量,(可以控制打印位置、分割、占位宽度、数值的显示方式、位数等),末尾不会自动换行,如需换行需要在printf第一个格式字符串参数末尾使用“\n”
在处理数据之前运行脚本
awk默认每次读入一行数据,然后用脚本进行处理。如果想在处理文本之前预处理一些命令,可以用BEGIN关键字指定。用END关键字在处理完所有数据后,再运行善后处理工作。
awk 'BEGIN{ commands } pattern{ commands } END{ commands }' file
其中:
BEGIN{ commands }
指定最开始执行的脚本pattern{ commands }
对文件的每一行遍历,判断是否满足pattern的模式,如果满足则执行脚本END{ commands }
指定最后执行的脚本
eg:打印“开始”,打印每行,打印“结束”:
awk 'BEGIN{ print "开始" } { print } END{ print "结束" }' 1.txt
输出
awk ‘{print $1$2}’ 表示每行分割后,将第一列(第一个字段)和第二列(第二个字段)连接在一起输出。
awk ‘{print $1 $2}’ 表示每行分割后,将第一列(第一个字段)和第二列(第二个字段)以默认输出分隔符”空格“隔开后显示。
awk ‘{print $1,$2}’ 表示每行分割后,将第一列(第一个字段)和第二列(第二个字段)以输出分隔符“,”隔开后显示。