linux-三剑客(sed、awk、grep)

文本处理工具,均支持正则表达式引擎

grep:文本过滤工具。
sed:流编辑器;文本编辑工具。
awk:linux的文本报告生成器,linux上是gawk
三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列

三剑客与正则表达式是什么关系呢?

我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。注意只有三剑客才能读懂这个模版哦!
三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列

正则表达式

现在他们的关系和功能都搞懂了,接下来我们就来认识下他们怎么结合的。正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。具体如下
在这里插入图片描述

所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。

grep:文本过滤工具

语法
grep  [options]  [pattern]  file
命令    参数        匹配模式    文件数据
                    -i : ignorecase,忽略字符的大小写
                    -o :  仅显示匹配到的字符串本身
                    -v : 显示不被模式匹配到的行,排除匹配结果
                    -E : 支持使用扩展的正则表达式元字符,-E 使用ERE,相当于egrep
                    -w : 只匹配过滤的单词
                    --color=auto 对匹配到的文本着色显示
					-n :  显示匹配的行号
					-c :  统计匹配的行数
					-q :  静默模式,不输出任何信息
					-A :  # after, 后#行
					-B :  # before, 前#行
					-C :  # context, 前后各#行
					-e :  实现多个选项间的逻辑or关系
					grep –e ‘cat ’ -e ‘dog’ file
					-F 相当于fgrep,不支持正则表达式                   


grep是linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大。

sed: 操作、过滤和转换文本内容的强大工具

sed 是操作、过滤和转换文本内容的强大工具。
1.sed模式空间,处理内存数据。

语法: 
 sed  [选项] [sed内置命令字符] [输入文件] 

选项: 
参数选项     解释
     -n:  不输出模式空间内容到屏幕,即不自动打印.取消sed的输出,常与sed内置命令p一起用。
     -i: 直接将修改结果写入文件,不用-i,sed修改的是内存数据。
	 -i.bak:  备份文件并原处编辑
	 -e: 多次编辑不需要管道符了
	 -r: 支持使用扩展正则表达式
	 -f:   /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
	 
sed常用内置命令字符:
sed的内置命令字符  解释 
	a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)(append,对文本追加,在指定行后面添加一行/多行文本)
	c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
	d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
	i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
	p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

组合多个表达式

sed ‘表达式’ | sed ‘表达式’ 等价于: sed '表达式; 表达式’

引用

sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。
案例:

[root@hdp0 sed]# test=hello
[root@hdp0 sed]#   echo hello world | sed "s/$test/hi~/"
hi~ world

定界符 命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符

sed 's:test:TEXT:g' a.txt
sed 's|test|TEXT|g' a.txt

定界符出现在样式内部时,需要进行转义:

 sed 's/\/bin/\/usr\/local\/bin/g' pwd.txt

sed s 替换脚本命令

sed s 替换脚本命令

此命令的基本格式为:
[address]s/pattern/replacement/flags
其中,address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。
关于指定具体操作行(address)的用法,这里先不做解释,文章后续会对其做详细介绍。

此命令中常用的 flags 标记如表 2 所示。

flags 标记功能
n1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file将缓冲区中的内容写到指定的 file 文件中;
&用正则表达式匹配的内容进行替换;
\n匹配第 n 个子串,该子串之前在 pattern 中用 () 指定。
\转义(转义替换部分包含:&、\ 等)。
案例:
sed 's/test/trial/2' data4.txt #使用数字 2 作为标记的结果就是,sed 编辑器只替换每行中第 2 次出现的匹配模式
sed 's/test/trial/g' data4.txt #用新文件替换所有匹配的字符串,可以使用 g 标记
 sed -n 's/test/trial/p' data5.txt   # -n 选项会禁止 sed 输出,但 p 标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行
 sed 's/test/trial/w test.txt' data5.txt  # **w 标记会将匹配后的结果保存到指定文件test.txt中**
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd #  在使用 s 脚本命令时,替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线进行转义

多点编辑:e命令 -e选项允许在同一行里执行多条命令

sed d 替换脚本命令

sed d 替换脚本命令
此命令的基本格式为:
[address]d
如果需要删除文本中的特定行,可以用 d 脚本命令,它会删除指定行中的所有内容。但使用该命令时要特别小心,如果你忘记指定具体行的话,文件中的所有内容都会被删除
案例:
sed 'd' data1.txt # 清空文件
sed '3d' data6.txt # 清空第三行数据
sed '2,3d' data6.txt # 删除 data6.txt 文件内容中的第 2、3行
sed '/1/,/3/d' data6.txt   #删除第 1~3 行的文本数据
sed '3,$d' data6.txt   # 删除 data6.txt 文件内容中第 3 行开始的所有的内容
#在此强调,在默认情况下 sed 并不会修改原始文件,这里被删除的行只是从 sed 的输出中消失了,原始文件没做任何改变。

sed c 替换脚本命令

c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。该命令的基本格式为:
[address]c\用于替换的新文本
案例:
sed '3c\  This is a changed line of text.' data6.txt  # sed 编辑器会修改第三行中的文本
sed '/number 3/c\  This is a changed line of text.' data6.txt  # sed 编辑器会修改第三行中的文本

sed y 转换脚本命令

y 转换命令是唯一可以处理单个字符的 sed 脚本命令,其基本格式如下:
[address]y/inchars/outchars/

转换命令会对 inchars 和 outchars 值进行一对一的映射,即 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符...这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则 sed 会产生一条错误消息。
案例:
sed 'y/123/789/' data8.txt # 使用7代替1,8代替2,9代替3

[root@localhost ~]# echo "This 1 is a test of 1 try." | sed 'y/123/456/'
This 4 is a test of 4 try.

sed p 打印脚本命令

p 命令表示搜索符号条件的行,并输出该行的内容,此命令的基本格式为:
[address]p
p 命令常见的用法是打印包含匹配文本模式的行,例如:
[root@localhost ~]# cat data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
[root@localhost ~]# sed -n '/number 3/p' data6.txt
This is line number 3.
可以看到,用 -n 选项和 p 命令配合使用,我们可以禁止输出其他行,只打印包含匹配文本模式的行。

sed w 脚本命令

w 命令用来将文本中指定行的内容写入文件中,此命令的基本格式如下:
[address]w filename
这里的 filename 表示文件名,可以使用相对路径或绝对路径,但不管是哪种,运行 sed 命令的用户都必须有文件的写权限。
下面的例子是将数据流中的前两行打印到一个文本文件中:
案例1:
[root@localhost ~]# sed '1,2w test.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
[root@localhost ~]# cat test.txt
This is line number 1.
This is line number 2.

案例2:
[root@localhost ~]# cat data11.txt
Blum, R       Browncoat
McGuiness, A  Alliance
Bresnahan, C  Browncoat
Harken, C     Alliance
[root@localhost ~]# sed -n '/Browncoat/w Browncoats.txt' data11.txt
cat Browncoats.txt
Blum, R       Browncoat
Bresnahan, C  Browncoat

通过使用 w 脚本命令,sed 可以实现将包含文本模式的数据行写入目标文件。

sed r 脚本命令

r 命令用于将一个独立文件的数据插入到当前数据流的指定位置,该命令的基本格式为:

[address]r filename
sed 命令会将 filename 文件中的内容插入到 address 指定行的后面
[root@localhost ~]# cat data12.txt
This is an added line.
This is the second added line.
[root@localhost ~]# sed '3r data12.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is an added line.
This is the second added line.
This is line number 4.
如果你想将指定文件中的数据插入到数据流的末尾,可以使用 $ 地址符,例如:
[root@localhost ~]# sed '$r data12.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
This is an added line.
This is the second added line.

sed q 退出脚本命令

q 命令的作用是使 sed 命令在第一次匹配任务结束后,退出 sed 程序,不再进行对后续数据的处理。

q 命令的作用是使 sed 命令在第一次匹配任务结束后,退出 sed 程序,不再进行对后续数据的处理。

root@localhost ~]# sed '2q' test.txt
This is line number 1.
This is line number 2.

可以看到,sed 命令在打印输出第 2 行之后,就停止了,是 q 命令造成的,再比如:
[root@localhost ~]# sed '/number 1/{ s/number 1/number 0/;q; }' test.txt
This is line number 0.

使用 q 命令之后,sed 命令会在匹配到 number 1 时,将其替换成 number 0,然后直接退出。

脚本scriptfile

sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

sed [options] -f scriptfile file(s)

awk

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值