awk [可选的命令行选项] ‘BEGIN{命令 } pattern{ 命令 } END{ 命令 }’ 文件名
BEGIN{命令}部分
执行时机
BEGIN块中的命令在awk开始读取输入文件之前执行。它主要用于初始化变量、设置全局环境等操作,这些操作只需要在处理文件之前执行一次。
示例
假设我们要计算一个文件中某列数字的总和,我们可以在BEGIN块中初始化一个变量来存储总和。
例如,有一个文件 data.txt,内容如下:
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
我们可以使用以下awk命令:
awk ‘BEGIN{sum = 0} {sum += $1} END{print sum}’ data.txt
awk ‘BEGIN{sum = 0} {sum += $1} END{print sum}’ data.txt
在这个例子中,BEGIN{sum = 0}初始化了变量 sum为0,这个操作在处理文件中的数据之前就已经完成。
pattern{命令}部分
执行时机与条件判断
pattern块中的命令针对每一个输入行进行处理,当输入行满足指定的模式(pattern)时执行其中的命令。如果没有指定模式,则默认对每一行都执行这些命令。
模式可以是正则表达式、关系表达式等。例如,我们可以指定只对包含某个特定字符串的行进行操作,或者对满足某个数值关系(如某列的值大于某个数)的行进行操作。
示例
还是以上面的 data.txt文件为例,如果我们只想对第一列数字大于3的行进行操作,我们可以这样写:
awk ‘$1 > 3{print $0}’ data.txt
awk ‘$1 > 3{print $0}’ data.txt
在这个命令中,$1 > 3是模式(pattern),{print $0}是当行满足模式时执行的命令,这里 $0表示整行内容。如果某一行的第一列数字大于3,就会打印出这一整行。
END{命令}部分
执行时机
END块中的命令在awk处理完所有的输入行之后执行。它通常用于输出最终结果、清理变量等操作。
示例
在前面计算文件中第一列数字总和的例子中,END{print sum}就是在处理完所有行之后,打印出变量 sum的值,也就是第一列数字的总和。如果没有END块,我们就无法得到最终的计算结果。
awk:https://mp.weixin.qq.com/s/nE_FqB_NaUhlF7HP_2xorQ
sed: https://mp.weixin.qq.com/s/5R-ymJ5xUfhYU9nX0uwhXw