一.什么是awk,nawk,gawk?
awk是一种用于处理数据和生成报表的UNIX编程语言。nawk是awk的新版本。gawk是基于linux的GNU版本。
二.awk的格式
awk程序是由awk命令,括在括号(或写在文件)中的程序指令以及输入文件的文件名几个部分组成。如果没有指定输入文件,输入则来自标准输入。
awk指令由模式、操作或模式与操作的组合组成。
awk以逐行方式扫描文件(或输入),从第一行到最后一行,以查找匹配某个特定模式的文本行,并对这些文本行执行(括在括号中的)指定动作。如果只给出模式而未指定动作,则所有匹配模式的行都显示在屏幕上。如果只指定动作而未定义模式,会对所有输入行执行自动动作。
1.从文件输入
格式:
awk 'pattern' filename
awk '{action}' filename
awk 'pattern {action}' filename
下面的例子分别演示了这三种格式
cat test_awk.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def hIc lmN dsf
sed范例
cat test_sed.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def hIc lmN dsf
A BC Def hIc lmN ABC
You are a good boy
you are not a good girl
That's a very lovely dog
例1. 打印:p命令
sed '/abc/p' test_sed.txt
输出:
abc def hic lmn abc
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def hIc lmN dsf
sed的工作流程
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。sed把当前正在处理的行保存在一个临时缓冲区中,这个缓冲区称为模式空间或临时缓冲。sed处理完模式空间中的行后(即在该行执行完sed后),就把该行发送到屏幕上(除非之前有命令删除这一行或取消打印操作),sed每处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理或显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时临时缓冲区中,对这个副本进行编辑,所以不会修改或破坏原文件。
定址
定址用于决定那些行用于编辑。地址的形式可以是数字,正则表达式或二者的结合。如果没有指定地址,sed将处理输入文件中的所有行。
如果指定的地址是一个数字,则这个数字代表行号。美元符号可以用来指代输入文件的最后一行。如果给出的是逗号分隔的两个行号,那么需要处理的地址就是这两行之间的范围(包括这两行在内)。范围可以是数字,正则表达式或二者的结合。
格式:
sed 'command' filename(s)
范例:
一些特殊的选项:
通常,第一个非选项的参数会指定要匹配的模式。你也可以提供多个模式,只要将它们放在引号里并以换行符分割他们。模式以减号开头时,grep会混淆,而将它视为选项。这就是-e选项排上用场的时候。他可以提供其参数为模式---即使它以减号开头。
例一:
grep -e 'boy' -e '^abc' test_grep.txt #abc def hic lmn abc #You are a good boy
使用-e可以以此匹配多个模式。
例二:
cat test_grep2.txt
-v
-l
-F
-f
grep '-v' test_grep2.txt 此时光标停在第二行,没有找到匹配行。这是因为grep将“-v”当做了选项,将test_grep2.txt当做了要匹配的模式,等在要求匹配的文件,因此在等待。此时用-e可以解决了
grep -e '-v' test_grep2.txt # -v
可以将所有匹配模式写到一个文件中,用-f选项后面跟上此文件,这样可以一次匹配多个模式。
cat pat_file
good
boy
linux查找文本命令 grep
cat test_grep.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def hIc lmN dsf
A BC Def hIc lmN ABC
You are a good boy
you are a good girl
you are not a good girl
That's a very lovely dog
例一:
grep -c 'good' test_grep.txt #3 cat test_grep.txt | grep 'good' | wc -l #3
这两种方法都可以统计含有‘good’的行数,但是第一种方法明显更简练。
例二:
grep -i 'abc' test_grep.txt #abc def hic lmn abc #ABC Def hIc lmN ABC #ABC Def hIc lmN dsf #A BC Def hIc lmN ABC
grep使用的正则表达式没有像其他语言那样的修饰符,如i,s,m。对于忽略大小写的匹配,可以用选项-i实现。