通常情况下,awk
将每个输入行解释为一条记录,将上一行的每个单词解释为每一个字段。
默认情况下,awk
使用空格或者制表符作为字段分隔符将输入分隔成字段。如果想要改变字段分隔符,可以使用**-F
**。$0
代表整个记录。
-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'[ ,]+'
[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
BEGIN 和 END
一般情况下,对于每个输入行,awk都会执行每个脚本代码块一次。
awk在处理文本之前处理可以放在BEGIN中。可以用来在开始前设置字段分割符等操作。
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之间的任意次出现 |
分隔出以逗号作为分隔符,符合指定模式 '/It/'所在行的数据的第一个字段。awk -F, '/It/ {print $1}' AwkDemo.txt
[danni@vm-bestgame-18 study]$ awk -F, '/It/ {print $1}' AwkDemo.txt
Oh