一,sed命令的用途
sed是Linux下一款功能強大的非交互流式文本編輯器,
可以對文本文件進行增、刪、改、查等操作,
支持按行、按字段、按正則匹配文本內容。
說明:劉宏締的架構森林是一個專注架構的博客,地址:https://www.cnblogs.com/architectforest
對應的源碼可以訪問這里獲取: https://github.com/liuhongdi/
說明:作者:劉宏締 郵箱: 371125307@qq.com
二,查看sed所屬的rpm包
[root@blog ~]$ whereis sed sed: /usr/bin/sed/usr/share/man/man1/sed.1.gz /usr/share/man/man1p/sed.1p.gz /usr/share/info/sed.info.gz [root@blog ~]$ rpm -qf /usr/bin/sed sed-4.5-1.el8.x86_64
如果找不到sed命令或命令被誤刪除
可以用dnf安裝
[root@blog ~]# dnf install sed
三,查看sed的版本和幫助
1,查看sed的版本
[root@blog ~]# sed --version sed(GNU sed) 4.5 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Jay Fenlason, Tom Lord, Ken Pizzini, and Paolo Bonzini. GNU sedhome page: <https://www.gnu.org/software/sed/>. General help using GNU software: <https://www.gnu.org/gethelp/>. E-mail bug reports to: <bug-sed@gnu.org>.
2,查看sed的幫助
[root@blog ~]# sed --help
3,查看sed的手冊
[root@blog ~]# man sed
四,sed功能之一:替換字符串
1,替換df空間已使用百分比的百分號%
#s:用來替換字符串
#g:在整行范圍內進行替換
#如果沒有g標記,則只替換每行第一個匹配到的字符串
[root@blog ~]# df -h | sed 's/%//g' Filesystem Size UsedAvail Use Mounted on devtmpfs 7.5G 0 7.5G 0 /dev tmpfs 7.5G 0 7.5G 0 /dev/shm tmpfs 7.5G 492K 7.5G 1 /run tmpfs 7.5G 0 7.5G 0 /sys/fs/cgroup
...
2,例:把/etc/passwd中的root替換成liu並把所在行顯示出來
#s:替換匹配到的字符串
#g:每行做全局匹配,否則每行只匹配遇到的第一個字符串
#p:打印
[root@blog ~]$ sed -n 's/root/liu/gp' /etc/passwd liu:x:0:0:liu:/liu:/bin/bash
3,運維中的例子:得到ip地址:
先查看ip的情況
[root@blog ~]# ip a show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:16:7c:a5 brd ff:ff:ff:ff:ff:ff inet 172.17.165.21/20 brd 172.17.175.255 scope global dynamic noprefixroute eth0 valid_lft 311890844sec preferred_lft 311890844sec
用sed得到ip
[root@blog ~]# ip a show eth0 | grep inet | sed 's/inet //' | sed 's/\/[0-9][0-9] brd.*$//g' 172.17.165.21
用awk得到ip
[root@blog ~]# ip a show eth0 | grep inet | awk '{print $2}' | awk -F/ '{print $1}' 172.17.165.21
這個例子說明如果獲取某列的信息,用awk更簡單一些,
這里只是為了舉例子演示sed的功能
五,sed功能之二:刪除指定的行
1,例子:打印每個分區和使用的占比,字段之間用-分隔
#sed '1d' :,刪除df結果中第一行的表頭,d:刪除
#--output-delimiter='-' 輸出時的分隔符也可以指定
#tr -d '%' 去掉百分比符號
[root@blog ~]$ df -h | sed '1d' | tr -s ' ' | cut -d ' ' -f 1,5 --output-delimiter='-' | tr -d '%' devtmpfs-0 tmpfs-0 tmpfs-1 tmpfs-0 /dev/vda1-15 /dev/vdb1-35
2,刪除包含某字符串行
例:不顯示所有包含tmpfs的文件系統
[root@blog ~]# df -h | sed '/tmpfs/d' Filesystem Size UsedAvail Use% Mounted on /dev/vda1 100G 15G 86G 15% / /dev/vdb1 500G 3.6G 497G 1% /databak
六,功能之三:打印匹配到的行
1,打印包含root字串的行
#-n: --quiet, --silent,只打印影響到的行
[root@blog ~]# sed -n '/root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash
2,打印指定的行
只打印第一行:
#p:打印
[root@blog ~]# sed -n '1p' /etc/passwd
打印1至3行
[root@blog ~]# sed -n '1,3p' /etc/passwd
七,功能之四:執行多項編輯操作
#-e:執行一項操作
#5,$d: 刪除從第5行到最末尾一行
#s/root/lhd/gp 把每行中匹配上的root替換成lhd並打印出來
[root@blog ~]# sed -e '5,$d' -e 's/root/lhd/gp' /etc/passwd
八,功能之五:在指定行顯示后退出
#q:在指定行顯示之后退出
#5q:在第5行顯示后退出
[root@blog ~]# sed '5q' /etc/passwd
九,功能之六:遍歷修改文件
1,修改單個文件的內容:
例:替換index.html中的'五二零'為'520'
#-i: 修改文件的內容
[root@blog 520]# sed -i 's/五二零/520/g' index.html
2,批量替換文件
例:把/data/dev/think_file/html/520/目錄下所有包含'五二零'的文件中的'五二零'為'520'
#-r: 遍歷子目錄查找
#-l:結果只顯示文件名
[root@blog 520]# sed -i 's/五二零/520/g' `grep 五二零 -rl /data/dev/think_file/html/520`
十,查看centos的版本
[root@blog ~]$ cat /etc/redhat-release CentOS Linux release 8.0.1905 (Core)