美文网首页
\# linux命令sed,awk,grep

\# linux命令sed,awk,grep

作者: Nickier | 来源:发表于2018-10-19 23:49 被阅读246次

---------------

#################

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中直接定义。

相关文章

网友评论

      本文标题:\# linux命令sed,awk,grep

      本文链接:https://www.haomeiwen.com/subject/srhpzftx.html