有事您Q我

Linux 三剑客之SED

sed

-n 不输出模式空间内容到屏幕,即不自动打印。

-r|-E 使用扩展的正则表达式

’p‘ 输出模式空间内容到屏幕,追加到默认输出之后

’d‘ 删除模式空间匹配的行,并立即启用下一轮循环

a [\] text 在指定行后面追加文本,支持使用\n实现多行追加

i [\] text 在行前面添加文本

c [\] text 替换行为单行或多行文本

w /path/file 保存模式匹配的行至指定文件

r /path/file 读取指定文件的文本至模式空间中匹配到的行后

= 为模式空间中的行打印行号

! 模式空间中匹配行取反处理

s/// 查找替换,支持使用其他分隔符,s@@@,s###

​ 替换标记:

​ g 行内全局替换

​ p 显示替换成功的行

​ w /PATH/FILE 将替换成功的行保存至文件中

-e 多点打印

-i.bak 备份并编辑文件

sed -n '$p' passwd 打印最后一行

sed -n '2p' passwd 打印第二行

sed -n '/^U/p' /etc/fstab 打印/etc/fstab下以U开头的行

sed -n '/^#/p' /etc/fstab 打印以#号开头的行

sed -n '$p' /etc/fstab 打印最后一行

seq 10 | sed -n '3,7p' 打印三到七行

sed -n '/root/,/lp/p' passwd 打印passwd文件以root和l之间的文本,包含以root和lp开头的行

sed -n '3,/^sshd/p' passwd 打印第三行到以sshd开头的行

seq 10 | sed -n '1~2p' seq生成十行数字,仅打印1+2行,奇数行

seq 10 | sed -n '2~2p' 仅打印偶数行

sed 'd' passwd 删除passwd文件的所有行,未对文件进行实质性修改

sed '2d' passwd 删除指定行的内容(第二行),未对文件进行实质性修改

sed '/^#/d' /etc/fstab 删除以#号开头的行,未对文件进行实质性修改

seq 10 | sed '1~2d' 删除1+2奇数行的数据,未对文件进行实质性修改

cat -n /etc/fstab | sed '2~2d' 删除2+2偶数行的数据,未对文件进行实质性修改

sed -i '/^Listen 8080/d' /etc/httpd/conf/httpd.conf 删除http.conf文件以Listen 8080开头的行(建议对文件进行备份),对文件进行了修改

sed 'axxx\nyyy\nzzz' /etc/fstab 为/etc/fstab文件的每一行下追加三行数据,1、xxx,2、yyy,3、zzz,未对文件进行实质性修改

sed '2axxx\nyyy\nzzz' 1.txt 在1.txt中的第二行后追加三行数据,1、xxx,2、yyy,3、zzz,未对文件进行实质性修改

sed '/^root/aadmin line' passwd 在以root开头后添加‘’admin line‘’字符,未对文件进行实质性修改

sed -i.bak '/^root/aadmin line' passwd 备份passwd文件名以passwd.bak命名,并修改原文件

sed '/^root/iadmin line' passwd 在以root开头的行前插入文本,不修改源文件

sed '/^root/i\ admin line' passwd 在以root开头的行前插入文本,在i后添加\代表\后为为文本添加的内容,不修改源文件

sed -i.bak '/^Listen 80/a\Listen 8080' /etc/httpd/conf/httpd.conf 备份conf文件命名为httpd.conf.bak并修改源文件,在httpd.conf文件中以Listen开头行后面添加Listen 8080

sed '/^Listen 80/c\Listen 8080' /etc/httpd/conf/httpd.conf 将/etc/httpd/conf/http.conf中以Listen 80开头的行进行替换,替换为Listen 8080,本条命令未对源文件进行修改

sed '/^SELINUX=enforcing/c\SELINUX=disabled' /etc/selinux/config 将/etc/selinux/config文件中以SELINUX=enforcing开头的行,替换为SELINUX=disabled,不修改原文件

sed -n '/^UUID/w fs1' /etc/fstab 将/etc/fastab中以UUID开头的行另存到当前文件夹下,明名为fs1

sed '/^UUID/r /etc/hosts' /etc/fstab 在/etc/fstab文件中以UUID开头的行下面读入/etc/fstab文件内容(每行下面都读入/etc/hosts文件内容),不修改原文件

sed '/^UUID/=' /etc/fstab 打印/etc/fstab文件中以UUID开头的行的行号(行号为实际文件行的序列)

sed -n '/^UUID/!p' /etc/fstab 打印/etc/fstab文件除以UUID开头的行

sed -n 's/UUID/uuid/p' /etc/fstab 搜索替换,在/etc/fstab文件中搜索到的UUID替换为小写的uuid(每行只替换一次)

sed -n 's/UUID/uuid/gp' fstab g参数代表全局替换,即将文件中的所有UUID替换为uuid并将替换过的行打印出来

一、小测试,使用sed截取本机IP地址(使用sed+ifconfig)

ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.186.134  netmask 255.255.255.0  broadcast 192.168.186.255
        inet6 fe80::37c0:1283:c933:b0ef  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:22:67:f9  txqueuelen 1000  (Ethernet)
        RX packets 917166  bytes 1183836113 (1.1 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 214561  bytes 113170703 (107.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

小括号代表分组,后面的数字代表打印第几组,加上\代表转意(注意空格)

-r|-E 使用扩展的正则表达式

ifconfig ens32 | sed -nr '2s/.*t (.*)  (net.*)/\1/p'  #*
ifconfig ens32 | sed -nr '2s/.*t (.*)   net.*/\1/p'
ifconfig ens32 | sed -rn '2s/(^.*inet )(.*)(  net.*$)/\2/p' #可以去掉^,$符号
ifconfig ens32 | sed -rn '2s/.*inet (.*)  net.*/\1/p'

二、以下文本需要将#号后有字符的#给去掉

#<IfModule mime_magic_module>
    #
    # The mod_mime_magic module allows the server to use various hints from the
    # contents of the file itself to determine its type.  The MIMEMagicFile
    # directive tells the module where the hint definitions are located.
    #
    MIMEMagicFile conf/magic
#</IfModule>

#
#EnableMMAP off


sed -n -r -e '/#<IfModule mime_magic_module>/,/#<\/IfModule>/s/#//p' -e '/#EnableMMAP off/s/#//p' httpd.conf

-e为多点编辑,'/#EnableMMAP off/s/#//p'搜索替换

三、打印路径或者目录名

echo /etc/sysconfig/network-scripts | sed -nr 's@(^.*/)([^/].*)/?$@\2@p' | sed -nr 's/(\/)?$//p'
echo /etc/sysconfig/network-scripts/ | sed -nr 's@(^.*/)([^/].*)/?$@\2@p'

四、将文件中没被注释掉的行给注释掉

sed -r 's/^[^#]/#&/' fstab

五、替换文件内容

sed -r -i 's/spectre_v2=retpoline rhgb quiet/spectre_v2=retpoline rhgb quiet net.ifnames=0/' grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rhgb quiet"
#替换为 GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"

ifconfig ens32 | sed -r '2!d;s/.*inet (addr:)?//;s/ .*//'

/root/.bashrc文件可以给系统中的命令起别名,比如 vi = vim,yum remove = yr,执行vi就等于执行了vim

格式为:alias yr='yum remove -y'
alias vi='vim'

​ alias vifs='vim /etc/fstab'

posted @ 2021-06-30 22:23  达芬Qi  阅读(175)  评论(0)    收藏  举报