Linux 的grep 、sed、awk

介绍

linux操作文本的三大利器,三者都能处理文本,侧重点不同,

grep 适合单纯查找或者匹配文本

sed 适合编辑匹配文本

awk 适合格式化文本,对文本进行较复杂的格式处理。

  • grep:数据查找定位

  • awk:数据切片

  • sed:数据修改

  • sed 和 awk 最大的区别:sed是以行向操作,awk是以列向操作

场景

命令

特点

应用场景

grep

文本过滤

包括从文件中进行过滤和从标准输入进行过滤,其过滤速度最快

sed

取行

文件内容新增、删除、替换、取出某个范围的内容

awk

取列

编写awk脚本对文本进行格式化输出(可进行统计计算)

grep

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

常见查进程命令:

ps -ef|grep xxxx

命令格式:grep [option] pattern file

命令参数

常用参数已加粗

  • -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。

  • -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。

  • -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。

  • -c:统计匹配的行数

  • -e :实现多个选项间的逻辑or 关系

  • -E:扩展的正则表达式

  • -f FILE:从FILE获取PATTERN匹配

  • -F :相当于fgrep

  • -i --ignore-case #忽略字符大小写的差别。

  • -n:显示匹配的行号

  • -o:仅显示匹配到的字符串

  • -q: 静默模式,不输出任何信息

  • -s:不显示错误信息。

  • -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配

  • -w :匹配 整个单词

grep -A/B/C

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

 grep -A2 7 test 789

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

grep -c 输入匹配行数

gerp -c 1 test

grep -e

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

grep -e aaaa -e bbbb test

grep -F相当于fgrep命令,就是将pattern视为固定字符串

➜ grep 'aa*' test
aaaa
AAAaaa

➜ grep -F 'aa*' test

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

sed

sed全称为Stream EDitor,sed是一个流编辑器,处理行内容时功能十分强大,可以利用脚本来处理文本文件或者是标准输入(stdin)。使用方法:

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 。

a 增加内容

先准备一个文件,名为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

i 插入内容

跟 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删除

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

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

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

c替换

替换也是一样,字符是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出现。

awk

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

语法

awk [选项参数]'script'var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
awk           -f {awk脚本} {文件名}

参数说明:

-F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

-v var=value or --asign var=value 赋值一个用户定义变量。

-f scripfile or --file scriptfile 从脚本文件中读取awk命令。

基本用法

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

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

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

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

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

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

apple

变量

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

➜ awk '{print $NF}'testtest
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}'test2

这一句的完整含义应该是:把每一行按照空格分割之后,如果第二个单词大于t,就输出第一个单词。这里对字符的大小判断应该是基于字符长度和 unicode 编码。

参考:Linux 文本处理三剑客:grep、sed 和 awk - 知乎 (zhihu.com)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

what_2018

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值