\# linux命令sed,awk,grep
---------------
#################
Nickier
2018-10-19
#################
---------------
# linux命令sed,awk,grep
sed
简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
使用格式
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明
1.-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
2.-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
3.-h或--help 显示帮助。
4.-n或--quiet或--silent 仅显示script处理后的结果。
5.-V或--version 显示版本信息。
动作说明
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法。
举例
# 在文件testfile中的第4行后面添加一行newline
sed -e 4a\newLine testfile
1539951436066.png
# 将testfile的内容列出来同时打印行号,使用sed '4d'删除第四行
nl testfile | sed '4d'
1539951717784.png
# 显示第5到7行nl testfile | sed -n '5,7p'
1539952207807.png
# 搜索关键词hello的行,除了输出所有含,还输出匹配行
nl testfile | sed '/hello/p'
1539952524900.png
# 搜索关键词hello的行,加上-n参数,只输出匹配行
nl testfile | sed -n '/hello/p'
1539952719298.png
awk
简介
awk是一个非常好用的数据处理工具。相较于sed常常一整行处理,awk则比较倾向于一行当中分成数个“字段”处理。
使用格式
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
参数说明
- -F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 - -v var=value or --asign var=value
赋值一个用户定义变量。 - -f scripfile or --file scriptfile
从脚本文件中读取awk命令。 - -mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 - -W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 - -W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。 - -W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。 - -W lint or --lint
打印不能向传统unix平台移植的结构的警告。 - -W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。 - -W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替和=;fflush无效。 - -W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。 - -W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。 - -W version or --version
打印bug报告信息的版本。
举例
# 输出第二列,默认分隔符为空格
awk '{print $2}' 1.txt
# 以o为切割,并输出第二列
awk -F"o" '{print $2}' 1.txt
1539954613575.png
# 使用内建变量,以o为分隔符,输出
awk 'BEGIN{FS="o"} {print $1,$2}' 1.txt
1539955394226.png
# 输出第一列大于2的行
nl 1.txt | awk '$1>2'
1539955600249.png
# 从文件中找出length大于12的行
awk 'length>12' 1.txt
1539955958785.png
grep
简介
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。
参数
-E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
--color :将匹配到的内容以颜色高亮显示。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context
# 取出含有字符创linux的行
grep linux 1.txt
# 取出含有字符创linux的行,并显示行号
grep linux 1.txt -n
# 取出不含有world的行并显示行号
grep world 1.txt -nv
1539957795629.png
总结
awk、sed、grep更适合的方向:
-
grep 更适合单纯的查找或匹配文本
-
sed 更适合编辑匹配到的文本
-
awk 更适合格式化文本,对文本进行较复杂格式处理
关于awk内建变量个人见解,简单易懂
解释一下变量:
变量:分为内置变量和自定义变量;输入分隔符FS和输出分隔符OFS都属于内置变量。
内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量。
-
FS(Field Separator):输入字段分隔符, 默认为空白字符
-
OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符
-
RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符
-
ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符
-
NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列)
-
NR(Number of Record):行号,当前处理的文本行的行号。
-
FNR:各文件分别计数的行号
-
ARGC:命令行参数的个数
-
ARGV:数组,保存的是命令行所给定的各参数
自定义变量的方法
-
方法一:-v varname=value ,变量名区分字符大小写。
-
方法二:在program中直接定义。