五.文件中的awk命令
如果awk命令别写到文件里,就要用-f选项指定awk的文件名。后面再加所要处理的输入文件的文件名。awk从缓冲区读入一条记录,接着测试awk文件中的每一条命令,如后对读入的记录执行命令。处理完一条记录后,awk将其丢弃,接着将下一条记录读入缓冲区,依次处理所有记录。
cat test_awk.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def cih lmN dsf
You are a good boy
That's a very lovely dog
cat shell.awk
/^ABC/{print "hello world "}
{print $1, $3}
例:
awk -f shell.awk test_awk.txt #abc hic #123 1.23 #hello world #ABC cih #hello world #ABC hIc #You a #That's very
说明:awk将第一条记录读入缓冲区,用shell.awk中的命令去处理,首先检查这条记录是不是以ABC开头,如果不是则继续对该条记录执行第二条命令,即打印第一和第三个字段。如果是以ABC开头的,则打印'hello world'和一个换行,然后再执行第二条命令打印第一和第三个字段。执行完第一条记录后,将其丢弃,然后读入第二条记录,执行上述操作。直到所有记录都处理完毕。
六、记录和字段
1.记录
记录:默认情况下,一行称为一条记录,以换行符结束。
记录分隔符:默认情况下,输入和输出记录的分隔符(行分隔符)都是回车符(换行符),分别保存在awk的内置变量ORS(output record separator)和RS(record separator)中,ORS和RS可以以特定的形式修改。
变量$0:awk用$0指代整条记录。
变量NR:当前已读的记录数,每条记录的记录号都保存在awk的内置变量NR中,每处理完一条记录,NR的值都会加一。
例.
awk '{print NR, $0}' test_awk.txt #1 abc def hic lmn abc #2 123 456 1.23 4.5 321 #3 ABC Def hIc lmN ABC #4 ABC Def cih lmN dsf #5 You are a good boy #6 That's a very lovely dog
2.字段
每条记录都是由字段组成的,默认情况下,字段之间是有空白符(即空格符和制表符)分割。awk在内置变量NF中保存记录的字段数。
3.字段和分隔符
输入字段分隔符:awk的内置变量FS保存着输入字段分隔符的值。使用FS默认值时,awk用制表符或空格来分割字段,并且删除各字段前多余的空格和制表符。可以通过在BEGIN语句中或命令行上赋值来改变FS的值。
从命令行改变字段分隔符:在命令行上改变FS的值徐啊哟使用-F选项,后面指定代表新分隔符的字符。
例:
awk -F : '/root/{print $1, $2, $6}' /etc/passwd #root x /root #operator x /root
说明:awk通过-F选项后面指定的冒号作为新的分隔符。
使用多个字段作为分隔符:如果有多个字段被用作字段分隔符FS,则FS对应的是一个正则表达式字符串,并且别括在方括号中。
例:
cat test
abc:bca cba cab
bca abc acb:bac
awk -F'[: ]' '{print $1, $3}' test #abc cba #bca acb
说明:当遇到冒号、空格和制表符时,awk会把它当做字段分隔符,这个表达式两头加了引号,这样就不会呗shell当做自己的元素符来解释了。
输出字段分隔符:默认的输出字段分隔符是单个空格,被保存在awk的内置变量OFS。无乱OFS如何设置,print语句中用于分隔字段的逗号,在输出时都会被转换成OFS的值。OFS可以通过在BEGIN语句来改变。