grep、sed和awk是linux下的文本处理工具。尤其是sed和awk,虽然使用起来比较复杂但是却非常实用
1.正则表达式
要想使用这三个工具,首先需要掌握正则表达式的使用,这里简单的用一个表格来介绍一下
行首符 | ^ | ^a (以a开头的字符) | 重复 | * | 重复0-任意个 |
行尾符 | $ | a$ (以a结尾的字符) | ? | 重复0-1个 | |
字符范围 | [] | [0-9] (0-9范围内的字符) | + | 重复1-任意个 | |
任意字符 | . | . (任意字符) | {n,m} | 重复n个-m个 |
这里只是简单的展示一下比较常用的几个符号,主要是为了下面更好的理解sed和awk
2.sed
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并不会发生改变。
常用参数:
-n 只输入经过sed处理后的那一行,如果不添加此参数则每一行都会被输出在屏幕上
-i 直接修改源文件而不是仅仅输出在屏幕上
sed的格式:
sed 参数 '命令' 要操作的文件
sed '2a 这是新增的一行' test.txt
其中最重要的当然就是命令这个部分了接下来我们来详细讲解一下命令这个部分
新增与删除
由于sed是以行为单位进行操作的所以我们这里先展示一下如何新增一行或者删除一行
新增
其实这个很好理解,首先a代表新增,2代表第二行 后面的文字就是我们要新增的内容。也就是说这个命令可以让我们在第二行的后面也就是第三行新增加我们所需要的文本内容。那如果我们需要在第二行的前面增加一行内容,也就是将原来的第二行后面的内容依次往下放一行而我们新增加的内容放在第二行该怎么办呢?
sed '1a 这是新增加的一行' test.txt
或者
sed '2i 这是新增加的一行' test.txt
这里的i其实就是插入,其实就是在第二行的前面加入一行。
删除
如何删除指定的行呢
sed '1d' test.txt
sed '1,3d' test.txt
sed '1,$d' test.txt
相信大家也都看出来了,这里的d就代表删除,前面的数字依旧代表行号第一行命令的意思就是删除第一行。而第二行有两个数字,这个其实代表的是删除第一到三行。注意这里删除的是第一行、第二行和第三行,而不是只删除第一行和第三行。最后一行其实很容易看出来了,$代表结束,也就是删除第一行到最后一行。
查找并打印
使用sed命令我们可以很容易的在大量的文本中查找到含有我们需要的关键词的行,并且将其打印出来,我们可以进行如下操作,比如查找root
sed '/root/p' test.txt
替换
替换可以说是sed中最最最最最实用,也是最常用的功能了。那么替换这个功能怎么写呢
sed 's/root/test/' test.txt
在这里出现了/ /看起来很像一个括号把我们需要的内容圈了起来。没错,在sed中/确实有这样的作用,但这不是他唯一的作用。这里我们先知道/的作用类似括号把我们需要的内容限定起来就可以了。然后就是一个孤零零的p也就是print的意思了。这样的话sed命令如果查找到含有root的行就会将这行打印出来。你们可以尝试一下看看是否能够达到理想的效果(其实应该写成"sed -n '/root/p' test.txt"想想为什么)
这里的s就是说明我们需要使用到替换这个功能了。接下里就是两个用/分开的部分,刚刚我们说过/的功能类似括号所以我们就把这里的root和test分成两部分来看。第一部分也就是root部分,就是被替换部分。第二部分也就是test部分,就是我们要替换成的部分。也就说这条命令的意思是我们要把每一行中的第一个root替换成test。注意这里只是说每行的第一个root那如果我们要把每行中所有的root都替换成test该怎么办呢?
sed 's/root/test/g' test.txt
我们需要加上g这个参数,代表全面替换即可
sed高级参数()
这个在sed里面是很实用的东西,例如当我们只想替换一部分内容的时候,就可以使用这个参数
sed 's/^\(#\)\([a-z]\)/\2/' test.txt
这里看起来比较复杂是因为括号在sed中是需要转义才能够使用的所以我们需要在括号前加上\转义符。简化一下看
sed 's/^(#)([a-z])/\2/' test.txt
这样就好理解多了,第一个括号就是我们需要匹配的第一部分在后面使用\1表示,而第二个部分使用\2表示。所以说这行sed命令的效果就是将每一行开头的#去除,实际上我们是将前面的两部分替换成了第二部分的内容从而实现去除的效果的。