欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

文本三剑客之sed命令--文本替换;grep命令---文本过滤

发布时间:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 文本三剑客之sed命令--文本替换;grep命令---文本过滤 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录

1.sed简介

2.sed的p命令--打印匹配行

3.sed的d命令--删除指定行

4.sed的a命令--在匹配行后面追加

5.sed的i命令--在匹配行前面插入

6.sed的c命令--整行替换

7.sed的r命令--将文件的内容读入

8.sed的w命令--将文本写入文件

9.sed的s命令--字符串替换(匹配正则表达式)核心用法


一.sed命令

1.sed简介

sed是一种支持正则表达式的非交互式流编辑器,是脚本中修改文本或者文本替换的最佳工具

sed本身也是一个管道命令,它可以将数据进行替换、删除、新增、选取特定行等功能

# 语法格式
sed   [选项]  sed编辑命令  输入文件

# 常用选项
-n:只显示匹配处理的行(否则会输出所有)
-r:支持扩展正则表达式
-i:直接在文件中进行修改,而不是输出到屏幕
-e:执行多个编辑命令时(一般用;代替)
-f:从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不用;隔开)

# 常用编辑命令
p:打印匹配行          print
d:删除指定行          delete
a:在匹配行后面追加    append
i:在匹配行前面插入  insert
c:整行替换
r:将文件的内容读入  read
w:将文本写入文件    write
s:字符串替换(匹配正则表达式)substitution
=: 输出行号

###以上的操作都既可以根据行号,又可以根据模式匹配

2.sed的p命令--打印匹配行

###打印第1行 [root@xieshan ~]# sed -n '1p' /etc/passwd root:x:0:0:root:/root:/bin/bash###打印第2行到第4行 [root@xieshan ~]# sed -n '2,4p' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin [root@xieshan ~]# sed -n '2,+2p' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin###打印最后一行 [root@xieshan ~]# sed -n '$p' /etc/passwd cali123:x:1026:1028::/home/cali123:/bin/bash###打印第一行和最后一行 [root@xieshan ~]# sed -n '1p;$p' /etc/passwd root:x:0:0:root:/root:/bin/bash cali123:x:1026:1028::/home/cali123:/bin/bash###不打印第4行到最后一行,即打印第1行到第3行,并且显示行号 [root@xieshan ~]# sed -n '4,$!{=;p}' /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin###打印匹配的adm行到匹配的sync行 [root@xieshan ~]# sed -n '/adm/,/sync/p' /etc/passwd adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync###打印第1行,第3行,第5行 [root@xieshan ~]# sed -n '1p;3p;5p' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin###打印第3行和第5行 [root@xieshan ~]# sed -n -e '3p' -e '5p' /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin### 从第一行开始,隔两行输出一行 [root@xieshan 0713]# cat /etc/passwd -n|sed -n '1~2p' #2是步长值,隔两个输出1 root:x:0:0:root:/root:/bin/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin11 games:x:12:100:games:/usr/games:/sbin/nologin13 nobody:x:99:99:Nobody:/:/sbin/nologin###匹配以s开头的行,根据正则模式来匹配,没有根据行号 [root@xieshan 0713]# sed -n '/^s/p' /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin sc:x:1000:1000:sc:/home/sc:/bin/bash sc1:x:1001:1001::/home/sc1:/bin/bash###不显示/etc/ssh/sshd_config里面的无效行,也就是不显示空行或者以#开头的行 [root@xieshan 0713]# sed -rn '/^#|^$/!p' /etc/ssh/sshd_config #|是扩展正则 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server###显示以/符号结尾的行,需要使用转义符号 [root@xieshan 0713]# df -h|sed -n '/\/$/p' /dev/mapper/centos-root 17G 3.9G 14G 23% / [root@xieshan 0713]# df -h|egrep '/$' #通常使用egrep查找 /dev/mapper/centos-root 17G 3.9G 14G 23% /

shell里的变量传递给sed--》传参问题--〉使用双引号,然后变量外面加上花括号

[root@xieshan 0713]# a=5 [root@xieshan 0713]# b=8 [root@xieshan 0713]# sed -n "${a}p;${b}p" /etc/passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin halt:x:7:0:halt:/sbin:/sbin/halt [root@xieshan 0713]# [root@xieshan 0713]# sg=sc [root@xieshan 0713]# sed -n "/${sg}/p" /etc/passwd sc:x:1000:1000:sc:/home/sc:/bin/bash

3.sed的d命令--删除指定行

[root@xieshan lianxi]# cat cali.txt cali hunan yongz rose jack###以下的操作都只是在屏幕上显示,实际文件并没有修改,要想直接在文件中进行修改,需要加上-i选项 #删除2到4行 [root@xieshan lianxi]# sed '2,4d' cali.txt cali jack#删除含有字符串z的行 [root@xieshan lianxi]# sed '/'z'/d' cali.txt cali hunan rose jack#删除不含有字符串z的行 [root@xieshan lianxi]# sed '/'z'/!d' cali.txt yongz #删除空行和注释 [root@xieshan lianxi]# sed -r '/^$|^#/d' cali.txt cali hunan yongz rose jack#删除空行以及以#开头的行 [root@xieshan 0713]# sed -i -r '/^#|^$/d' sshd_config [root@xieshan 0713]# cat sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server [root@xieshan 0713]#

4.sed的a命令--在匹配行后面追加

###追加操作可以根据行号和模式匹配进行操作 [root@xieshan lianxi]# cat cali.txt cali hunan yongz rose jack#在第2行后面追加字符串1000 [root@xieshan lianxi]# sed '2a 1000' cali.txt cali hunan 1000 yongz rose jack#在包含root的行下面追加字符串1000 [root@xieshan lianxi]# sed '/root/a 1000' /etc/passwd root:x:0:0:root:/root:/bin/bash 1000 operator:x:11:0:operator:/root:/sbin/nologin 1000

5.sed的i命令--在匹配行前面插入

### 插入操作可以根据行号和模式匹配进行操作 [root@xieshan lianxi]# cat cali.txt cali hunan yongz rose jack#在cali.txt的最后一行前面插入字符串1000 [root@xieshan lianxi]# sed '$i 1000' cali.txt cali hunan yongz rose 1000 jack#在包含root的行的前面插入字符串1000 [root@xieshan lianxi]# sed '/root/i 1000' /etc/passwd 1000 root:x:0:0:root:/root:/bin/bash 1000 operator:x:11:0:operator:/root:/sbin/nologin

6.sed的c命令--整行替换

#### 更改整行操作可以根据行号和模式匹配进行操作[root@xieshan lianxi]# cat cali.txt cali hunan yongz rose jack#将第3行整行替换成字符串1000 [root@xieshan lianxi]# sed '3c 1000' cali.txt cali hunan 1000 rose jack#将root所在的行 整行替换成字符串1000 [root@xieshan lianxi]# sed '/root/c suda' /etc/passwd suda bin:x:1:1:bin:/bin:/sbin/nologin[root@xieshan 0713]# cat ifcfg-ens33 BOOTPROTO="none" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.2.43 PREFIX=24 GATEWAY=192.168.2.1 DNS1=114.114.114.114 [root@xieshan 0713]# sed -i '4c ONBOOT="no"' ifcfg-ens33 [root@xieshan 0713]# cat ifcfg-ens33 BOOTPROTO="none" NAME="ens33" DEVICE="ens33" ONBOOT="no" IPADDR=192.168.2.43 PREFIX=24 GATEWAY=192.168.2.1 DNS1=114.114.114.114 [root@xieshan 0713]# sed -i '/^BOOTPROTO/c BOOTPOROTO="yes"' ifcfg-ens33 [root@xieshan 0713]# cat ifcfg-ens33 BOOTPOROTO="yes" NAME="ens33" DEVICE="ens33" ONBOOT="no" IPADDR=192.168.2.43 PREFIX=24 GATEWAY=192.168.2.1 DNS1=114.114.114.114 [root@xieshan 0713]# sed -i '/^ONBOOT/ s/no/yes/' ifcfg-ens33 [root@xieshan 0713]# cat ifcfg-ens33 BOOTPOROTO="yes" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.2.43 PREFIX=24 GATEWAY=192.168.2.1 DNS1=114.114.114.114

7.sed的r命令--将文件的内容读入

### 读入操作可以根据行号和模式匹配进行操作# 在/etc/passwd文件的末尾后面读入cali.txt文件的内容 [root@xieshan lianxi]# sed '$r cali.txt' /etc/passwd califeng:x:1025:1027::/home/califeng:/bin/bash cali123:x:1026:1028::/home/cali123:/bin/bash cali hunan yongz rose jack

8.sed的w命令--将文本写入文件

[root@scchen1 /]# cat selinux# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted#把selinux中以#开头的行,不写入a.txt文件中 [root@scchen1 /]# sed '/^#/!w a.txt' selinux [root@scchen1 /]# cat a.txtSELINUX=disabled SELINUXTYPE=targeted

9.sed的s命令--字符串替换(匹配正则表达式)核心用法

        1.sed替换的基本语法:

 sed 's/原字符串/替换的字符串'

        2.特殊的字符样式需要使用转义符号\,但是单引号内无法使用转义字符,所以sed替换的语法还可以写成:

 sed "s/原字符串/替换的字符串"

        3.可以在匹配公式最后面加一个g,这样就会替换每一个匹配的字符串,否则只替换每行的第一个匹配的字符串

 sed "s/原字符串/替换的字符串/g"

        4.一些特殊字符的使用:

# ^表示以什么开头,$表示以什么结尾 # 注意这里的`&`符号,如果没有`&`,就会直接将匹配到的字符串替换掉 sed 's/^/添加的头部&/g'      #在所有行首添加 sed 's/$/&添加的尾部/g'      #在所有行末添加 sed '2s/原字符串/替换字符串/g'  #替换第2行 sed '$s/原字符串/替换字符串/g' #替换最后一行 sed '2,5s/原字符串/替换字符串/g' #替换2到5行 sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行

     

[root@xieshan 0713]# cat /etc/selinux/config# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted [root@xieshan 0713]# sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config [root@xieshan 0713]# cat /etc/selinux/config# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted

  5.多个替换可以在同一条命令中执行,使用;分隔,或者使用-e选项

# 同时执行两个替换规则 sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' sed 's/^/添加的头部&/g -e s/$/&添加的尾部/g'

6.编辑一个test.txt文件,内容如下:

0.0.0.0

1.1.1.1

2.2.2.2

输出如下形式:

0.0.0.0:80,1.1.1.1:80,2.2.2.2:80

[root@localhost shell]#sed -i 'N;N;s/\n/:80,/g;s/$/:80/' test.txt [root@localhost shell]# cat test.txt 0.0.0.0:80,1.1.1.1:80,2.2.2.2============= #xargs:将多行变成单行。将前面的标准输出通过管道进行标准输入得到的内容分割成一个一个的参数,使用空格隔开。 [root@localhost shell]#cat test.txt.bak|xargs 0.0.0.0 1.1.1.1 2.2.2.2 [root@localhost shell]#cat test.txt.bak|xargs|awk '{print $1":80,"$2":80,",$3":80"}' 0.0.0.0:80,1.1.1.1:80, 2.2.2.2:80

7.sed命令中&的用法

&表示替换命令中的匹配模式:代表模式匹配到的内容,然后可以引用 [root@localhost shell]# echo "i have a fat cat" i have a fat cat [root@localhost shell]# echo "i have a fat cat"|sed 's/.at/".at"/g' i have a ".at" ".at" [root@localhost shell]# echo "i have a fat cat"|sed 's/.at/"&"/g' i have a "fat" "cat"###将所有三位的数字后面加上0,四位数的不加,注意使用词边界 [root@localhost shell]# cat renxiaojing.txt ........ tanxue zhang shuaishuai 123 zhang 456pengpeng pengpeng pengpeng pengpeng xuyalan jingjing jingjing jingjing [root@localhost shell]# sed -i -r 's/\<[0-9]{3}\>/&0/g' renxiaojing.txt [root@localhost shell]# cat renxiaojing.txt ..... tanxue zhang shuaishuai 1230 zhang4560pengpeng pengpeng pengpeng pengpeng xuyalan jingjing jingjing jingjing#给文件中所有的大写字母后面加上2022 [root@localhost shell]# sed -n -r 's/[A-Z]/&2022/gp' test1.txt abcH2022H2022H2022H2022dddde abF2022K2022D2022dddde isO2022O2022O2022ishabxil H2022E2022P2022R2022E2022doodcm

8.\  \:转义字符

[root@localhost shell]# sed -n '/13\/Jul\/2022:16:53:58/,/13\/Jul\/2022:16:56:21/p' access.log sed -n [root@localhost shell]# sed -n '#13/Jul\/2022:16:53:58#,#13/Jul/2022:16:56:21#p' access.loglocalhost shell]# sed -n 's#Jul#Aug#gp' access.log|head -5 修改时间:date -s "修改的时间"

9.标签

####小圆括号里面匹配的就是一个标签,后面再替换的时候可以引用,第一个小圆括号里的是\1,以此类推。 [root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/' ccc bbb aaa [root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3/' ccc [root@localhost shell]# echo aaa bbb ccc |awk '{print $3,$2,$1}' ccc bbb aaa

10.将以下文本倒序输出

0.0.0.0

1.1.1.1

2.2.2.2

[root@localhost shell]# tac test.txt.bak 2.2.2.2 1.1.1.1 0.0.0.0 方法二: [root@localhost shell]# cat test.txt.bak|xargs|awk '{print $3"\n"$2"\n"$1}' 2.2.2.2 1.1.1.1 0.0.0.0

二.grep命令

1.grep的常用两种格式:

第一种:

cat /etc/password | grep "root"

第二种:

grep "root" /etc/passwd

grep命令还可以叠加使用

# 将/etc/passwd里没有出现root和nobody的行取出来
grep -v root /etc/passwd | grep -v nobody

2.常用的grep选项:

-i    ignore    # 不区分大小写

-v    invert    # 取反,只打印没有匹配的,而匹配的反而不打印(只针对整行取反)

-n    number    # 显示匹配行及行号

-c    count    # 输出匹配行的数目

-o    only-matching
# 只显示匹配行中匹配正则表达式的那部分
# 经常和 wc -l 命令搭配使用

-r    recursive    # 递归的对目录下的所有文件(包括子目录)进行grep查找

-E    Extend    # 开启扩展的正则表达式
egrep = grep -E

-A n    after    # 显示匹配到的字符串所在的行及其后n行

-B n    before    # 显示匹配到的字符串所在的行及其前n行
-C n    context    # 显示匹配到的字符串所在的行及其前后各n行

# 举例 # 将/etc/passwd文件中以root开头和以nobody开头的行取出来 [root@huyuxuan /]# cat /etc/passwd | grep -E "^root|^nobody" root:x:0:0:root:/root:/bin/bash nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin [root@huyuxuan /]# cat /etc/passwd | egrep "^root|^nobody" root:x:0:0:root:/root:/bin/bash nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

3.匹配字符

[]        # 指定范围内的单个字符

[0-9]    # 匹配0到9中的任意一个数字
[0-Z]    # 匹配所有的字母和数字
[a-z]    # 匹配a~z的所有的小写字母中的任意一个
[A-Z]    # 匹配A~Z的所有的大写字母中的任意一个
[a-Z]    # 匹配所有的大小写字母中的任意一个
[abc]    # 匹配一个字符,这个字符必须是abc中的一个

[^]        # 指定范围外的的单个字符,取反

[^123]    # 匹配一个字符,这个字符是除了1、2、3以外的所有字符

.        # 代表单个任意字符

.*        # 代表任意个任意字符

4.匹配次数

?        # 前面的字符出现0次或1次
+        # 前面的字符出现1次以上
*        # 前面的字符出现任意多次
? 、* 、+ 默认只能修饰前面一个字符

{n}        # 表示前面的字符出现n次
{n,m}    # 表示前面的字符最少出现n次,最多出现m次
{n, }    # 表示前面的字符最少出现n次

5.位置锚定

^        # 锚定行的开始
'^suda'匹配所有以suda开头的行

$        # 锚定行的结束
'suda$'匹配所有以suda结尾的行

^$        # 匹配空白行

\b        # 单词锁定符
\b或\<    # 锚定单词的词首
\b或\>    # 锚定单词的词尾

# 举例
'\bsuda\b'只匹配suda
'\bsuda'只匹配单词以suda开头
'suda\b'只匹配单词以suda结尾

6.分组以及引用

()        # 利用圆括号可以实现多个字符分组
        # 在圆括号中利用"|"实现或者的功能
    
# 举例
(aa|bb){2}

总结

以上是生活随笔为你收集整理的文本三剑客之sed命令--文本替换;grep命令---文本过滤的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。