Linux 文本处理三剑客:grep、sed 和 awk

这篇具有很好参考价值的文章主要介绍了Linux 文本处理三剑客:grep、sed 和 awk。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。

grep

Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

命令的基本格式:

grep [option] pattern file

即便不熟悉这个命令,应该大多数同学也用过查询进程的命令:

ps -ef|grep xxxx

这就是 grep 的一个基本用法,从所有进程中搜索某个进程。

grep 常用的参数如下:

  • -A<行数 x>:除了显示符合范本样式的那一列之外,并显示该行之后的 x 行内容。
  • -B<行数 x>:除了显示符合样式的那一行之外,并显示该行之前的 x 行内容。
  • -C<行数 x>:除了显示符合样式的那一行之外,并显示该行之前后的 x 行内容。
  • -c:统计匹配的行数
  • -e :实现多个选项间的逻辑or 关系
  • -E:扩展的正则表达式
  • -f 文件名:从文件获取 PATTERN 匹配
  • -F :相当于fgrep
  • -i --ignore-case #忽略字符大小写的差别。
  • -n:显示匹配的行号
  • -o:仅显示匹配到的字符串
  • -q: 静默模式,不输出任何信息
  • -s:不显示错误信息。
  • -v:显示不被 pattern 匹配到的行,相当于[^] 反向匹配
  • -w :匹配 整个单词

前三个 A、B、C 参数很容易理解,举个栗子,假设我们有一个文件,文件名是 test,内容是从 1 到 9,每个数字一行:

➜ grep -A2 7 test
7
8
9

-A2 7 的效果就是找到 7 ,然后输出 7 后面两行。

同理,-B2 7-C2 7就是找到 7 ,然后分别输出 7 前面两行和前后两行:

➜ grep -B2 7 test
5
6
7

➜ grep -C2 7 test
5
6
7
8
9

继续,假设我们有个名叫 test 的文件内容如下:

➜ cat test
aaaa
bbbbbb
AAAaaa
BBBBASDABBDA

grep -c命令的作用就是输出匹配到的行数,比如我们想找包含aaa的有几行,一眼就能看出来有两行,第一行和第三行都包含:

➜ grep -c aaa test
2

grep -e命令是实现多个匹配之间的关系,比如我们想找包含aaaa或者bbbb的,显然应该返回第一行和第二行:

➜ grep -e aaaa -e bbbb test
aaaa
bbbbbb

grep -F相当于fgrep命令,就是将pattern视为固定字符串。比如搜索'aa*'不带-F和带上,区别如下:

➜ grep 'aa*' test
aaaa
AAAaaa

➜ grep -F 'aa*' test

可以看到第二次就找不到了,因为搜索的是 aa*这个字符串,而不是正则表达式。

grep -f 文件名的使用方法是把后面这个文件里的内容当做pattern。比如我们有个文件,名字是 grep.txt,然后内容是aa*,使用方法如下:

➜ grep -f grep.txt test
aaaa
AAAaaa

实际上等同于grep 'aa*' test

grep -i --ignore-case作用是忽略大小写。

grep -n显示匹配的行号,就是多显示了个行号,不用细说。

grep -o仅显示匹配到的字符串,还是用刚才的aa*距离,之前显示的都是匹配到的字符所在的整行,这个命令是只显示匹配到的字符:

➜ grep -o 'aa*' test
aaaa
aaa

grep -q不打印匹配结果。刚看到这个我疑惑了半天,让你搜索字符串,你不给我结果那有啥用?然后发现还有一条很多教程没说:如果有匹配的内容则立即返回状态值 0。所以一般用在shell脚本中,在 if 判断里面。

grep -s不显示错误信息,不解释。

grep -v显示不被匹配到的行,相当于[^]反向匹配,最常见的还是用在查找线程的命令里,有时候会打印grep线程,可以再加上这么一个去除自己:

➜ ps -ef|grep Typora
  501 91616     1   0 五11上午 ??        13:39.32 /Applications/Typora.app/Contents/MacOS/Typora
  501 14814 93748   0  5:33下午 ttys002    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn Typora

➜ ps -ef|grep Typora|grep -v grep
  501 91616     1   0 五11上午 ??        13:39.32 /Applications/Typora.app/Contents/MacOS/Typora

可以看到第二次就没有打印grep线程自身

grep -w匹配整个单词,只有完全符合pattern的单次才会匹配到:

➜ grep aaa test
aaaa
AAAaaa

➜ grep -w aaa test

可以看到第二次结果为空,因为没有aaa这个单词。

关于正则的高级用法就不再深入研究了,改日再统一整理。

sed

sed 命令的作用是利用脚本来处理文本文件。使用方法:

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明

  • -e<script>--expression=<script> 以选项中指定的 script 来处理输入的文本文件,这个-e可以省略,直接写表达式。
  • -f<script文件>--file=<script文件>以选项中指定的 script 文件来处理输入的文本文件。
  • -h--help显示帮助。
  • -n 或 --quiet 或 --silent 仅显示 script 处理后的结果。
  • -V 或 --version 显示版本信息。

动作说明

  • a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。

我们先准备一个文件,名为test做测试,内容如下:

➜ cat test 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test

增加内容

使用命令sed -e 3a\newLine testfile这个命令的意思就是,在第三行后面追加newLine这么一行字符,字符前面要用反斜线作区分。执行完毕之后可以看到结果:

➜ sed -e 3a\newline test  
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
newline
Linux test

但是注意,这个只是将文字处理了,没有写入到文件里,文件里还是之前的内容。

其实 a 前面是可以匹配字符串,比如我们只想在出现 Linux 的行后面追加,就可以:sed -e /Linux/a\newline test 两个斜线之间的内容是需要匹配的内容。可以看出,只有第二、第四行有Linux,所以结果如下:

➜ sed -e /Linux/a\newline test 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
newline
This is a linux testfile!  
Linux test 
newline

这里用双引号把整个表达式括起来也可以,还方便处理带空格的字符。

sed -e /Linux/a\newline test等效于sed "/Linux/a newline" test

插入内容

跟 a 类似,sed 3i\newline test是在第三行前面插入newline:

➜ sed 3i\newline test
HELLO LINUX!  
Linux is a free unix-type opterating system.  
newline
This is a linux testfile!  
Linux test

sed /Linux/i\newline test是在所有匹配到Linux的行前面插入:

➜ sed /Linux/i\newline test
HELLO LINUX!  
newline
Linux is a free unix-type opterating system.  
This is a linux testfile!  
newline
Linux test

可以看出插入的用法和增加很相似。

删除

删除的字符是d,用法跟前面也很相似,就不赘述,例子如下:

➜ sed '/Linux/d' test      
HELLO LINUX!  
This is a linux testfile!

可以看到删除了匹配到的两行。

替换

替换也是一样,字符是c。举个栗子:

➜ sed '/Linux/c\Windows' test                   
HELLO LINUX!  
Windows
This is a linux testfile!  
Windows

替换还有个字符是 s,但是用法由不太一样了,最常见的用法:sed 's/old/new/g'其中old代表想要匹配的字符,new是想要替换的字符,比如:

➜ sed 's/Linux/Windows/g' test
HELLO LINUX!  
Windows is a free unix-type opterating system.  
This is a linux testfile!  
Windows test

这里的/g的意思是一行中的每一次匹配,因为一行中可能匹配到很多次。我们拿一个新的文本文件做例子:

➜ cat test2
aaaaaaaaaaa
bbbbbabbbbb
cccccaacccc

假设我们想把一行中的第三次及以后出现的a变成大写A,那应该这么写:

➜ sed 's/a/A/3g' test2
aaAAAAAAAAA
bbbbbabbbbb
cccccaacccc

可以看出只有第一行的有的改了,因为第二第三行没有这么多a出现。

关于s还有很多用法,还是回到第一个文件,比如可以用/^//$/分别代表行首和行尾:

➜ sed 's/^/###/g' test
###HELLO LINUX!  
###Linux is a free unix-type opterating system.  
###This is a linux testfile!  
###Linux test 

➜ sed 's/$/---/g' test
HELLO LINUX!  ---
Linux is a free unix-type opterating system.  ---
This is a linux testfile!  ---
Linux test ---

这个其实就是正则表达式的语法,其他类似语法还有:

  • ^ 表示一行的开头。如:/^#/ 以#开头的匹配。
  • $ 表示一行的结尾。如:/}$/ 以}结尾的匹配。
  • \< 表示词首。 如:`\ 表示以 abc 为首的詞。
  • \> 表示词尾。 如:abc\> 表示以 abc 結尾的詞。
  • . 表示任何单个字符。
  • * 表示某个字符出现了0次或多次。
  • [ ] 字符集合。 如:[abc] 表示匹配a或b或c,还有 [a-zA-Z] 表示匹配所有的26个字符。如果其中有^表示反,如 [^a] 表示非a的字符

以上的所有用法,还可以在字符前面增加行号或者匹配。什么意思呐?比如你想在第一和第二行后面增加一行内容newline,就是:

➜ sed '1,2a\newline' test
HELLO LINUX!  
newline
Linux is a free unix-type opterating system.  
newline
This is a linux testfile!  
Linux test

其他操作同理。不止可以用数字来限定范围,还可以用匹配来限定,只需要用//括起来:

➜ sed '/LINUX/,/linux/i\test' test
test
HELLO LINUX!  
test
Linux is a free unix-type opterating system.  
test
This is a linux testfile!  
Linux test

这里的意思是,从匹配到LINUX的那一行,到匹配到linux的那一行,也就是 123 这三行

,都做插入操作。

多个匹配

-e命令可以执行多次匹配,相当于顺序依次执行两个sed命令:

➜ sed -e 's/Linux/Windows/g' -e 's/Windows/Mac OS/g' test
HELLO LINUX!  
Mac OS is a free unix-type opterating system.  
This is a linux testfile!  
Mac OS test

这个命令其实就是先把Linux替换成Windows,再把Windows替换成Mac OS

写入文件

上面介绍的所有文件操作都支持在缓存中处理然后打印到控制台,实际上没有对文件修改。想要保存到原文件的话可以用> file或者-i来保存到文件

awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

语法

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

参数说明:

  • -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
  • -v var=value or --asign var=value 赋值一个用户定义变量。
  • -f scripfile or --file scriptfile 从脚本文件中读取awk命令。

基本用法

最基本的用法是awk 动作 文件名。我们先准备一个文件test

➜ cat test 
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

然后输入awk '{print $1,$4}' test就可以看到:

2 a
3 like
This's 
10 orange,apple,mongo

对比可以很清楚的发现,这行语句的作用是打印每行的第一个和第四个单词。这里如果是$0的话就是把整行都输出出来。

awk -F命令可以指定使用哪个分隔符,默认是空格或者 tab 键:

➜ awk -F, '{print $2}' test



apple

可以看出只有最后一行有输出,因为用逗号做分割,之后最后一行被分成了10 There are orangeapplemongo三项,然后我们要的是第二项。

还可以同时使用多个分隔符:

➜ awk -F '[ ,]'  '{print $1,$2,$5}' test 
2 this test
3 Are awk
This's a 
10 There apple

这个例子便是使用空格和逗号两个分隔符。

匹配项中可以用正则表达式,比如:

➜ awk '/^This/' test
This's a test

匹配的就是严格以This开头的内容。

还可以取反:

➜ awk '$0 !~ /is/' test 
3 Are you like awk
10 There are orange,apple,mongo

这一个的结果就是去掉带有is的行,只显示其余部分。

从文件中读取:awk -f {awk脚本} {文件名},这个很好理解,就不再做解释。

变量

awk中有不少内置的变量,比如$NF代表的是分割后的字段数量,相当于取最后一个。

➜ awk '{print $NF}' test            
test
awk
test
orange,apple,mongo

可以看出都是每行的最后一项。

其他的内置变量还有:

  • FILENAME:当前文件名
  • FS:字段分隔符,默认是空格和制表符。
  • RS:行分隔符,用于分割每一行,默认是换行符。
  • OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
  • ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
  • OFMT:数字输出的格式,默认为%.6g

函数

awk还提供了一些内置函数,方便对原始数据的处理。主要如下:

  • toupper():字符转为大写。
  • tolower():字符转为小写。
  • length():返回字符串长度。
  • substr():返回子字符串。
  • sin():正弦。
  • cos():余弦。
  • sqrt():平方根。
  • rand():随机数。

条件

awk允许指定输出条件,只输出符合条件的行。输出条件要写在动作的前面:

awk '条件 动作' 文件名

还是刚才的例子,用逗号分隔之后有好几个空白行,我们加上限制条件,匹配后为空的不显示:

➜ awk -F, '$2!="" {print $2}' test
apple

可以看到就只剩下apple了。

if 语句

awk提供了if结构,用于编写复杂的条件。比如:

➜ awk '{if ($2 > "t") print $1}' test
2

这一句的完整含义应该是:把每一行按照空格分割之后,如果第二个单词大于t,就输出第一个单词。这里对字符的大小判断应该是基于字符长度和 unicode 编码。文章来源地址https://www.toymoban.com/news/detail-798017.html

到了这里,关于Linux 文本处理三剑客:grep、sed 和 awk的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Linux中字符处理三剑客(grep sed awk )

    在 Linux 系统中,字符处理流程可以利用三个常用的工具来完成,三剑客的具体说明如下: grep:grep 是一种强大的文本搜索工具,可以搜索文件内容中包含指定文本的行,并打印出包含该文本的行。grep 命令通常用于搜索日志文件、配置文件等。 在Linux中,\\\"grep\\\"是一种文本搜索

    2024年02月08日
    浏览(63)
  • linux命令三剑客grep、sed、awk

    准备 grep、sed、awk号称\\\"linux三剑客\\\",使用频繁,功能强大,本文通过一个实例演示下基本用法。首先准备一个文本文件,命名为text.txt,写入文件内容: grep 首先,最简单的是grep。经常用来过滤查看日志。对于grep需要知道如下几个常用的命令选项: -n: 额外输出行号。例如过

    2024年02月05日
    浏览(49)
  • Linux三剑客grep、sed、awk(包括练习题)

    Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。 基本用法与常见的正则表达式 扩展正则表达式实践 此处使用grep -E 进行实践扩展正则,egrep官网已经弃用 注意:sed和awk使用单引号,双引号有特殊解释 sed是Stream Editor(字符流编辑器)的缩写

    2024年02月11日
    浏览(46)
  • Linux三剑客(awk、sed、grep) 和 正则表达式

    Linux三剑客(awk、sed、grep) 和 正则表达式

    本文章适用于一定工作经验(熟悉Linux基础)的同行,欢迎各位大佬批判指正。 上手三剑客(grep,sed,awk)之前,需要熟悉正则表达式, 正则表达式 ——事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的

    2024年02月15日
    浏览(50)
  • 运维(SRE)成长之路-第3天 文本处理三剑客之 grep

    运维(SRE)成长之路-第3天 文本处理三剑客之 grep

     grep: 全局搜索正则表达式并打印行(Global search REgular expression and Print out the line)作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行模式:由正则表达式字符及文本字符所编写的过滤条件   格式: 常见选项: –color=auto 对匹配到的

    2024年02月09日
    浏览(13)
  • 文本三剑客之~~~sed命令

    文本三剑客之~~~sed命令

    sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 包括读取,执行和显示三个过程 读取:sed从输入流(文件,管道

    2024年02月05日
    浏览(17)
  • 文本三剑客之sed编辑器

    文本三剑客之sed编辑器

    Sed是一个强大的文本处理工具,其名称是Stream Editor(流编辑器)的缩写。它被设计用于根据用户定义的规则对文本进行逐行处理和转换。 Sed通过从输入流中逐行读取文本,并根据用户指定的命令来对每一行进行处理 sed的工作原理是 逐行读取 输入文本,并根据用户 指定的命

    2024年02月12日
    浏览(9)
  • Shell编程基础(十五)文本三剑客(sed)

    sed提供了一种免交互的方式修改文件内容。 它是一行一行处理,可以通过正则匹配要修改的部分 基本语法 sed [-opt] command files(多个文件 空格隔开) sed 使用扩展正则,不加r不能完全匹配扩展正则表达式 sed -r “正则匹配数据行/指定行号 sed命令” files sed 修改内容写回文件 默认

    2024年02月13日
    浏览(10)
  • Shell脚本攻略:文本三剑客之grep

    Shell脚本攻略:文本三剑客之grep

    目录 一、理论 1.grep 2.sort 3.uniq 4.tr 5.cut 6.split 7.paste 二、实验 1. grep ​编辑 ​编辑 2.sort 3.uniq ​编辑 4.tr 5.cut 6.split 7.统计当前主机的连接状态 8.统计当前连接主机数 9.获取信息 (1)概念 grep是Linux中最常用的”文本处理工具”之一,grep与sed、awk合称为Linux中的三剑客。 grep的

    2024年02月07日
    浏览(43)
  • 快速上手Linux核心命令(五):文本处理三剑客

    快速上手Linux核心命令(五):文本处理三剑客

    目录 前言 正则表达式 第一剑客 grep 第二剑客 sed 第三 剑客 awk 小结 上一篇中已经预告,我们这篇主要说Linux文本处理 三剑客 。他们分别是 grep 、 sed 、 awk 。既然能被业界称为三剑客,可见其在Linux命令中占有举足轻重得地位。所以呢,这里也专门写一篇文章说一说其用法。

    2023年04月25日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包