通常情况下,awk
将每个输入行解释为一条记录,将上一行的每个单词解释为每一个字段。
默认情况下,awk
使用空格或者制表符作为字段分隔符将输入分隔成字段。
分割后,$0
代表整个记录,$1
表示第一个字段,$2
表示第二个字段,以此类推…
-F:指定分割符,可以指定一个或多个作为分割符
用法示例一:指定单个分割符
pwd | awk -F"/" '{print $NF}'
:输出当前所在的文件夹的名称
-F"/"
表示把分割符设置成/
,$NF
表示输出分隔后的最后一个字段
[danni@vm-xxx develop]$ pwd
/home/danni/work/develop
[danni@vm-xxx develop]$ pwd | awk -F"/" '{print $NF}'
develop
用法示例二:指定多个分割符
已知test.txt的文本内容为:
[danni@vm-xxx log]$ cat test.txt
I am a beautyful girl, I am in class 8
分隔符采用空格和逗号中的一个或多个进行分割:-F'[ ,]+'
此处采用了正则表达式的写法,[]
表示可以匹配 [] 里面的任意一个,+ 表示匹配前面的正则表达式1次或者多次。
[danni@vm-xxx log]$ awk -F'[ ,]+' '{print $5 " " $10}' test.txt
girl 8
FS:字段分隔符(Field Separator)
定义输出的字段的分隔符。
FS="\t+"
:表示使用一个或多个tab进行分割的分隔符,+ 表示一个或多个前一字符
[danni@vm-xxx develop]$ echo -e "aaa\t\tbbb\n ccc\tddd" | awk -v FS="\t+" '{print $2}'
bbb
ddd
NF
NF
:表示将要显示的一行记录中有多少个字段
$NF
:表示显示一行记录中的最后一个字段
示例:使用 -F
指定分隔符为逗号,输出NF
表示使用逗号分隔后的字段的数目,$NF
表示最后个字段的值
[danni@vm-xxx log]$ echo "a,b,c,d,e" | awk -F',' '{print NF" "$NF}'
5 e
NR:当前行数
示例:输出行号大于2的行数被分隔后的第一个字段
[danni@vm-xxx log]$ echo -e "one \n two \n three three1" | awk '{if(NR > 2){print $1}}'
three
OFS:输出字段分隔符(Out of Field Separator)
BEGIN
是在文件开始扫描前进行的操作,此处在BEGIN时设置了输出分隔符是 |
[danni@vm-xxx run]$ echo -e "111 222 \n 333 444" | awk 'BEGIN {OFS="|"} {print $1,$2}'
111|222
333|444
awk正则表达式(Out of Field Separator)
符号 | 表示的含义 |
---|---|
* | 与前面的正则表达式的零个或多个 出现匹配 |
. | 匹配任何单个 字符 |
\ | 转义随后的特殊字符 |
^ | 作为正则表达式的第一个字符,表示匹配行的开始 |
$ | 作为正则表达式的最后一个字符,表示匹配行的结尾 |
+ | 匹配前面的正则表达式的一次或多次 出现 |
? | 匹配前面的正则表达式的零次或一次 出现 |
() | 对正则表达式分组 |
[...] | 匹配方括号中的字符类中的任意一个 ,如果方括号中的第一个字符为^表示否定匹配 |
{n,m} | 匹配它前面某个范围内单个字符出现的次数 ,{n} 将匹配n次出现,{n,} 至少匹配n次出现,{n,m} 匹配n和m之间的任意次出现 |