awk是Linux处理文本的利器,在linux日常处理中,发挥很重要的作用,学会使用awk可以让你的处理文本工作事半功倍。此处记录下,awk常用的处理文本方法。
基本用法
#action中要输出字符串需用双引号`"`括起来。
1. `awk '{[pattern] action}' {filename}`
2. `awk -F fs '{action}' {filename}`
常用参数
参数 |
描述 |
-F fs / --field-separator fs
|
指定分隔符fs,可以是字符串或正则表达式。默认按TAB和空格进行分割
|
-v var=value / --asign var=value
|
用户自定义变量 |
内建常用变量
变量 |
描述 |
$n |
当前记录的第n个字段,由fs分隔 |
$0 |
当前完整记录,还未分隔字符串 |
NF |
当前记录的字段数量 |
NR |
即行号,从1开始算 |
运算符
运算符 |
描述 |
= / += / -= / *= / /= / %= / ^= / **=
|
赋值运算符 |
?: |
C条件表达式 |
|| |
逻辑或 |
&& |
逻辑与 |
< / <= / > / >= / != / ==
|
关系运算符 |
空格 |
连接 |
+ /-
|
加减 |
* /\ /\%
|
乘/除/求余 |
+ /- /!
|
一元加/一元减/逻辑非 |
++ /--
|
自增/自减 |
in |
数组成员 |
~ /~!
|
匹配正则表达式/不匹配正则表达式 |
BEGIN/END块
BEGIN{开始处理前执行的语句}
{每行执行的语句}
END{处理完所有行之后执行的语句}
使用示例
~$ cat test.txt
1 my name is kl
2 I'm a software developer
3 I'm so hungry
4 I don't have money,house,girlfiend
# 使用默认分隔符分隔
~$ awk '{print $1,$4}' test.txt
1 is
2 software
3 hungry
4 have
# 使用指定分隔符分隔
~$ awk -F, '{print $1,$2}' test.txt
1 my name is kl
2 I'm a software developer
3 I'm so hungry
4 I don't have money house
# 使用比较运算符
~$ awk '{if($1>2) print $0}' test.txt
3 I'm so hungry
4 I don't have money,house,girlfiend
# 同上
~$ awk '$1>2 {print $0}' test.txt
3 I'm so hungry
4 I don't have money,house,girlfiend
# 使用逻辑与
~$ awk '$1>2 && $2=="I" {print $0}' test.txt
4 I don't have money,house,girlfiend
# 使用正则,打印第二列包含I的行
~$ awk '$2 ~ /I/ {print $0}' test.txt
2 I'm a software developer
3 I'm so hungry
4 I don't have money,house,girlfiend
# 同上
awk '{if($2 ~ /I/)print $0}' test.txt
2 I'm a software developer
3 I'm so hungry
4 I don't have money,house,girlfiend
# 使用变量
~$ awk '{print NR, $0}' test.txt
1 1 my name is kl
2 2 I'm a software developer
3 3 I'm so hungry
4 4 I don't have money,house,girlfiend
# 使用BEGIN/END,对第一列求和
~$ awk 'BEGIN{sum=0} {sum+=$1} END{print "sum is " sum }' test.txt
sum is 10
# 改变第1列的值
~$ awk '{$1++ ;print $0}' test.txt
2 my name is kl
3 I'm a software developer
4 I'm so hungry
5 I don't have money,house,girlfiend