sed命令:git
將指定的文本文件內容逐行讀取至sed的臨時內存空間當中,成爲"模式空間",而後逐行查看是否被sed的地址定界所匹配到,若是匹配正則表達式
則執行相應的編輯命令,不然,默認將模式空間中的內容輸出至標準輸出centos
sed [OPTION]... 'script' [input-file]...bash
script:地址定界編輯命令ide
經常使用選項:spa
-n:靜默模式,不輸出模式空間中的內容至標準輸出3d
-e:定義多個sed scriptthree
-f /PATH/TO/SED_SCRIPT_FILEip
每行一個編輯命令內存
-r:啓用擴展正則表達式
-i:直接編輯原文件
sed -i.bak 'script' FILE:在編輯原文件以前先備份原文件爲FILE.bak
地址定界:
(1)空地址:對全文進行處理
(2)單地址:
#:指定行
/pattern/:被此模式所匹配到的每一行
(3)地址範圍:
#,#:起始到結束
#,+#:指定的行開始向後加#行
#,/pat1/
/pat1/,/pat2/
(4)步進:~
1~2:全部奇數行
2~2:全部偶數行
編輯命令:
d:刪除模式空間中的內容
p:顯示被模式所匹配到的內容
a \string:在指定的行後面添加新行,內容爲string
\n:換行
i \string:在指定的行前面追加新行,內容爲string
\n:換行
c \string:把匹配到的行替換爲string
w /PATH/TO/SOMEFILE:將匹配到的行的內容保存至指定文件中
r /PATH/FROM/SOMEFILE:將指定文件中的內容追加至所匹配到的行後面
=:爲模式匹配到的行打印行號
!:條件取反
地址定界!編輯命令
s/PATTERN/STRING/修飾符:查找並替換,其分隔符可自定義,例如s@@@,s###等等
PATTERN:可以使用正則表達式的模式進行查找匹配
STRING:使用字符串定義替換的內容,可以使用後向引用\1,\2,…
&:引用前面PATTERN所匹配到的全部內容
修飾符:
p:顯示替換成功的內容
w /PATH/TO/SOMFILE:將替換成功的內容保存至指定文件當中
i:查找替換時忽略大小寫
g:全局替換,默認只替換每行第一個被PATTERN所匹配到的內容
練習:
1.刪除/boot/grub2/grub.cfg文件中全部以空白字符開頭的行的行首的全部空白字符
[root@CentOS7 ~]# cat /boot/grub2/grub.cfg | sed -r 's@^[[:space:]]+@@' # # DO NOT EDIT THIS FILE # # It is automatically generated by grub2-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### set pager=1 if [ -s $prefix/grubenv ]; then load_env fi if [ "${next_entry}" ] ; then set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true else set default="${saved_entry}" fi if [ x"${feature_menuentry_id}" = xy ]; then menuentry_id_option="--id" else menuentry_id_option="" fi export menuentry_id_option if [ "${prev_saved_entry}" ]; then set saved_entry="${prev_saved_entry}" save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true fi
2.刪除/etc/fstab文件中全部以#開頭的行的行首的#號及#後面的全部空白字符
[root@CentOS7 ~]# cat /etc/fstab | sed -r 's@^#[[:space:]]+@@' This is one line. This is two line. This is three line. # /etc/fstab Created by anaconda on Thu Jul 21 12:06:23 2016 # Accessible filesystems, by reference, are maintained under '/dev/disk' See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0 UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot xfs defaults 0 0 UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir xfs defaults 0 0 UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0 [root@CentOS7 ~]#
3.在/root/install.log每一行行首增長#號
[root@CentOS6 ~]# sed -r 's@^@#@' install.log #Installing zip-3.0-1.el6_7.1.x86_64 #Installing rfkill-0.3-4.el6.x86_64 #Installing rdate-1.4-16.el6.x86_64 #Installing bridge-utils-1.2-10.el6.x86_64 #Installing b43-fwcutter-012-2.2.el6.x86_64 #Installing latrace-0.5.9-2.el6.x86_64 #Installing trace-cmd-2.2.4-3.el6.x86_64 #Installing crash-trace-command-1.0-5.el6.x86_64 #Installing m17n-db-thai-1.5.5-1.1.el6.noarch #Installing scenery-backgrounds-6.0.0-1.el6.noarch #Installing gnome-backgrounds-2.28.0-2.el6.noarch #Installing ql2400-firmware-7.03.00-1.el6_5.noarch #Installing iwl5000-firmware-8.83.5.1_1-1.el6_1.1.noarch #Installing ql2100-firmware-1.19.38-3.1.el6.noarch #Installing ivtv-firmware-20080701-20.2.noarch #Installing libertas-usb8388-firmware-5.110.22.p23-3.1.el6.noarch #Installing xorg-x11-drv-ati-firmware-7.6.1-2.el6.noarch
4.在/etc/fstab文件中不以#開頭的行的行首增長#號
[root@CentOS6 ~]# sed -r 's@^[^#]@#&@' /etc/fstab # # /etc/fstab # Created by anaconda on Thu Jul 21 15:34:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # #UUID=f4d977bb-af76-4617-b07f-9c70ae42a056 / ext4 defaults 1 1 #UUID=7907abdd-41cd-4609-8392-80e4a88c5b4c /boot ext4 defaults 1 2 #UUID=50054489-14c8-4e49-a912-2ff368371653 /testdir ext4 defaults 1 2 #UUID=d9f41da6-9df2-410f-8074-500425b26a3d swap swap defaults 0 0 #tmpfs /dev/shm tmpfs defaults 0 0 #devpts /dev/pts devpts gid=5,mode=620 0 0 #sysfs /sys sysfs defaults 0 0 #proc /proc proc defaults 0 0 [root@CentOS6 ~]#
5.處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
[root@CentOS6 ~]# echo /etc/sysconfig/network-scripts/ | sed 's@^\(.*\/\)\([^/]\+\/\?\)@\1@' #取出目錄名 /etc/sysconfig/ [root@CentOS6 ~]# echo /etc/sysconfig/network-scripts/ | sed 's@^\(.*\/\)\([^/]\+\/\?\)@\2@' #取出基名 network-scripts/ [root@CentOS6 ~]#
6.利用sed 取出ifconfig命令中本機的IPv4地址
[root@CentOS7 ~]# ifconfig | sed -n '/\<inet\>/p' | sed -r 's@inet (([[:digit:]]+\.){3}[[:digit:]]+).*@\1@' 10.1.253.23 127.0.0.1 192.168.122.1 [root@CentOS7 ~]#
7.統計centos安裝光盤中Package目錄下的全部rpm文件的以.分隔倒數第二個字段的重複次數
[root@CentOS7 Packages]# df -lh #查看光盤是否掛載 Filesystem Size Used Avail Use% Mounted on /dev/sda2 50G 4.1G 46G 9% / devtmpfs 475M 0 475M 0% /dev tmpfs 489M 84K 489M 1% /dev/shm tmpfs 489M 7.1M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda5 20G 61M 20G 1% /testdir /dev/sda1 197M 139M 59M 71% /boot tmpfs 98M 20K 98M 1% /run/user/42 tmpfs 98M 0 98M 0% /run/user/0 /dev/sr0 7.3G 7.3G 0 100% /media/cdrom [root@CentOS7 Packages]# ls | sed -r 's@.*\.([^.]+)\.rpm$@\1@' | sort | uniq -c #取出倒數第二個字段的重複次數 2000 i686 2938 noarch 1 TRANS.TBL 4069 x86_64 [root@CentOS7 Packages]#
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:把保持空間中的內容覆蓋至模式空間中
G:把保持空間中的內容追加至模式空間中
x:把模式空間中的內容與保持空間中的內容互換
n:覆蓋讀取匹配到的行的下一行至模式空間中
N:追加讀取匹配到的行的下一行至模式空間中
d:刪除模式空間中的行
D:刪除多行模式空間中的全部行
示例:
1.顯示文件偶數行
[root@CentOS7 Packages]# sed -n 'n;p' /etc/fstab # This is two line. # # Created by anaconda on Thu Jul 21 12:06:23 2016 # Accessible filesystems, by reference, are maintained under '/dev/disk' # UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot xfs defaults 0 0 UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0 [root@CentOS7 Packages]#
2.文件逆序顯示
[root@CentOS7 Packages]# sed '1!G;h;$!d' /etc/fstab UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0 UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir xfs defaults 0 0 UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot xfs defaults 0 0 UUID=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0 # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # Accessible filesystems, by reference, are maintained under '/dev/disk' # # Created by anaconda on Thu Jul 21 12:06:23 2016 # /etc/fstab # # This is three line. # This is two line. # This is one line. [root@CentOS7 Packages]#
3.顯示文件的最後兩行內容
[root@CentOS7 Packages]# nl /etc/fstab | sed '$!N;$!D' 13UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir xfs defaults 0 0 14UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0 [root@CentOS7 Packages]#
4.將文件的空白行刪除,而且在每行後面添加空白行
[root@CentOS7 ~]# sed '/^$/d;G' /etc/fstab # This is one line. # This is two line. # This is three line. # # /etc/fstab # Created by anaconda on Thu Jul 21 12:06:23 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0 UUID=1b0c5c77-c343-4139-9533-0ef66ffe5d39 /boot xfs defaults 0 0 UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir xfs defaults 0 0 UUID=6cfc5ecc-625f-4a4c-936f-95e4bab93dd6 swap swap defaults 0 0 [root@CentOS7 ~]#
5.顯示奇數行
[root@CentOS7 ~]# sed 'n;d' fstab # This is one line. # This is three line. # /etc/fstab # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info UUID=89ec9224-65c7-4461-9350-9d5e016d016c / xfs defaults 0 0 UUID=e70e4b66-c716-4d00-a483-4771fea4a9c1 /testdir xfs defaults 0 0 [root@CentOS7 ~]#