LINUX SHELL的神器,sed
我們知道,Vim 采用的是交互式文本編輯模式,你可以用鍵盤命令來交互性地插入、刪除或替換數(shù)據(jù)中的文本。但本節(jié)要講的 sed 命令不同,它采用的是流編輯模式,最明顯的特點是,在 sed 處理數(shù)據(jù)之前,需要預(yù)先提供一組規(guī)則,sed 會按照此規(guī)則來編輯數(shù)據(jù)。
sed 會根據(jù)腳本命令來處理文本文件中的數(shù)據(jù),這些命令要么從命令行中輸入,要么存儲在一個文本文件中,此命令執(zhí)行數(shù)據(jù)的順序如下:
每次僅讀取一行內(nèi)容;
根據(jù)提供的規(guī)則命令匹配并修改數(shù)據(jù)。注意,sed 默認(rèn)不會直接修改源文件數(shù)據(jù),而是會將數(shù)據(jù)復(fù)制到緩沖區(qū)中,修改也僅限于緩沖區(qū)中的數(shù)據(jù);
將執(zhí)行結(jié)果輸出。
當(dāng)一行數(shù)據(jù)匹配完成后,它會繼續(xù)讀取下一行數(shù)據(jù),并重復(fù)這個過程,直到將文件中所有數(shù)據(jù)處理完畢。
1. sed 命令格式
1.1 sed的語法命令格式:
sed?[選項]?sed編輯命令?輸入文件 shell?命令?|?sed?[選項]?sed編輯命令、 sed?[選項]?-f?sed腳本文件?輸入文件1.2 sed的常用選項:
-n:只顯示匹配處理的行(否則會輸出所有) -e:執(zhí)行多個編輯命令時(一般用;代替) -i:直接在文件中進(jìn)行修改,而不是輸出到屏幕(此時不要接-n或-p命令,會導(dǎo)致源文件出問題) -r:支持?jǐn)U展正則表達(dá)式 -f:從腳本文件中讀取內(nèi)容并執(zhí)行(文件中的編輯命令每行一個,不用;隔開)1.3 sed的常用編輯命令:
p:打印匹配行 print d:刪除指定行 delete a:在匹配行后面追加 append i:在匹配行前面插入 insert c:整行替換 r:將文件的內(nèi)容讀入 read w:將文本寫入文件 write s:字符串替換(匹配正則表達(dá)式)substitution1.4 sed的p命令示例:
sed?-n?'1,2p'??/etc/passwd???顯示前面兩行 sed?-n?'2,3p'??/etc/passwd???顯示2到3行 sed?-n?'10p'??/etc/passwd????顯示第10行 sed?-n?'$p'?/etc/passwd????顯示最后1行 sed?-n?'2,+2p'?/etc/passwd???顯示234行 sed?-n?'3,100!p'?/etc/passwd??顯示1到2行 sed?-n?'1p;3p;5p'??/etc/passwd??顯示1,3,5,行2. sed 模式
sed?-n?‘/模式/p’?輸入文件 這里的模式可以是正則表達(dá)式也可以是精確字符 模式用/括起,擴(kuò)展正則要加?-r選項 sed?-n?‘/bash/p’?/etc/passwd 顯示包含bash的行 sed?-rn?‘/^#/!p’?/etc/grub.conf 不顯示#號開頭的 sed?-n?‘/\/$/p’ 顯示以/結(jié)尾的行 sed?-n?‘/^[a-z]/p’ 顯示以字母開頭的行PS:
#cat?-n?file.txt|sed?-n?'1~2p' 顯示單數(shù)行,~表示步長執(zhí)行結(jié)果:
1??#include?"stdio.h"3??#define?MAX?105??//char?array[MAX]?=?{?[0?...(MAX-1)]?=?'8'?};79??????????for(int?i?=?0;?i<?MAX;?i++)11??????????return?0;顯示偶數(shù)行
#cat?-n?file.txt|sed?-n?'0~2p'執(zhí)行輸出:
246??char?array[MAX]?=?{'A'};8??int?main(void){10??????????????????printf("array[%d]=%c\n",i,array[i]);12??}sed里單引號和雙引號的區(qū)別:
雙引號里可以使用shell里的變量,單引號不能; 單引號和雙引號里都可以存放模式。3. sed的d命令示例
刪除操作可以根據(jù)行號和模式匹配進(jìn)行操作
sed??'3,5d'?/etc/fstab?? 刪除3到5行 sed?'/2/d'?/etc/fstab 刪除包含數(shù)字2的行 sed?'/ext3/!d'?/etc/fstab 除了包含ext3的行都刪除 sed?-r?'/^$|^#/d'?/etc/inittab刪除空行和注釋
sed?-e?'/^$/d'?-e?'/^#/d'?/etc/vsftpd/vsftpd.conf sed?'/^$/d??;???/^#/d'?/etc/vsftpd/vsftpd.conf3.1 sed的a命令示例:
追加操作可以根據(jù)行號和模式匹配進(jìn)行操作 :
sed?'1a?1111111111111111'?/etc/fstab 在第一行后面追加后面的字符串 sed?'/boot/a?1111111111111'?/etc/fstab 在包含boot的行下面追加后面的字符串3.2 sed的i命令示例
插入操作可以根據(jù)行號和模式匹配進(jìn)行操作 :
sed?'$i?1111111111111111'?/etc/fstab 在最后一行前面插入后面的字符串 sed?'/defaults/i?1111111111111'?/etc/fstab 在包含defaults的行前面插入后面的字符串3.3 sed的c命令示例
更改整行操作可以根據(jù)行號和模式匹配進(jìn)行操作
sed?‘/id:/c?id:5:initdefault:'?/etc/inittab 將id:所在的行整行替換成后面的字符串 sed?'3c?ONBOOT=no'?ifcfg-eth0 將第三行改成后面的字符串3.4 sed的r命令示例
讀入操作可以根據(jù)行號和模式匹配進(jìn)行操作
sed?‘$r?/etc/hosts'?/etc/fstab 在fstab文件的末尾后面讀入hosts文件的所有內(nèi)容 df?-h?|?sed?'/dev\/sda1/r?/etc/mtab‘ 在/dev/sda1后面讀入mtab文件的內(nèi)容3.5 sed的w命令示例(w命令不加-i也是直接修改原文件!!)
寫入文件操作可以根據(jù)行號和模式匹配進(jìn)行操作
sed?'1w?abc.txt'?/etc/passwd 將文件的第一行寫到abc.txt(和r命令正好相反) sed?'/^#/!w?abc.txt'?/etc/inittab 將所有不是#開頭的行都寫入abc.txt sed?-r?'/^#|^$/!w??abc.txt'?/etc/vsftpd/vsftpd.conf 將配置文件中除了空行和注釋都寫入abc.txt所以,對于sed的w命令,建議使用grep命令,然后追加到文件。
3.6 sed的s命令
格式:sed -n [行號或模式]s/查找內(nèi)容/替換內(nèi)容/[替換標(biāo)記] 文件 替換操作可以根據(jù)行號和模式匹配進(jìn)行操作 替換標(biāo)記有四種
數(shù)字:替換每行的第幾個 g:全局替換,否則只替換第一個字符串。例如ng從第n個開始替換 p:顯示被執(zhí)行替換操作的行和-n合用 w:將執(zhí)行替換操作的行輸出到指定文件 sed的s命令 sed?-n?'s/root/ROOT/2p'?/etc/passwd 將文件中每行的第2個root替換為ROOT sed?'/^id/s/3/5/'?/etc/inittab 將文件中找到以id開頭的行中的:3:替換成:5:(先用^id找出行) sed??'/^local_enable/s/YES/NO/'??vsftpd.conf 禁止本地用戶登陸 sed?'s/:/\n/g'?/etc/passwd 將文件中的:號替換為換行符 sed?'s/bash/nologin/?;?s/sbin/bin/'?/etc/passwd 將文件中bash替換成nologin,同時將sbin替換成bin sed?-n?'2,10s/^/#/p'?/etc/passwd 在2到10行前面加上注釋 sed?-n?‘s/$/?/p'?/etc/passwd 在每行末尾加上問號sed的s命令可以使用任意分隔符作為定界符
sed??-n?'/^hello/s|/bin/bash|/sbin/nologin|p'?/etc/passwd sed??-n?'/^hello/s:/bin/bash:/sbin/nologin:p'?/etc/passwd注意:
-i選項是直接修改文件,小心使用?!!! sed?-i?'/模式/s/源字符/替換成/g'?文件名4 練習(xí)
1.sed取出/etc/passwd文件的第一列 2.sed將PATH環(huán)境變量中的冒號換成換行 3.sed將PATH環(huán)境變量斜杠/換成斜杠\ 4.sed修改SELINUX配置文件從開啟變成禁用(/etc/sysconfig/selinux) 5.去掉/etc/passwd文件中第二個地段的x 6.修改/etc/inittab文件里的3或者5修改為6 7.編寫一個腳本實現(xiàn)修改ip地址: 7.1.提醒用戶輸入ip地址和子網(wǎng)掩碼、dns、網(wǎng)關(guān) 7.2.需要判斷新輸入的ip地址是否有人使用,如果有人使用這個ip地址,就不能去修改ip,并且提示。 7.3.刷新網(wǎng)絡(luò)服務(wù),讓新的ip地址生效。答案:
1.#?cat?passwd|sed?-r?'s/(^[0-Z]+)(.*)/\1/'???--》\1表示第一個標(biāo)簽 2.#?echo?$PATH|sed?'s/:/\n/g' 3.#?echo?$PATH|sed?-r?'s/\//\\/g' 或者#?echo?$PATH|sed?-r?'s#/#\\#g'(以#作分界符) 4.#?cat?selinux|sed??'/^SELINUX=/s/enforcing/disabled/g' 5.#?awk?-F:???'{print?$1":"$3":"$4":"$6":"$7}'?passwd 或者:# awk -F:?' OFS=":"{print $1,$3,$4,$5,$6,$7}' passwd --》OFS指定分隔符 或者:# cat passwd|sed 's/:x:/::/g' 6.#?cat?inittab?|sed?-r?'/^id/s/:[35]:/:6:/g' 7. #!/bin/bashread?-p?"Please?input?the?ip:"?IP read?-p?"Please?input?the?netmask:"?MASK read?-p?"Please?input?the?dns?server:"?DNS read?-p?"Please?input?the?gateway:"?GATEWAYa=$(cat?ifcfg-eth0|grep?"IPADDR"|cut?-d?'='?-f2) if?[[?$IP?==?$a?]] thenecho?"The?IP:$IP?is?exist!!!" elsesed?-i?"{/IPADDR/c?IPADDR=$IP/NETMASK/c?NETMASK=$MASK/DNS1/c?DNS1=$DNS/GATEWAY/c?GATEWAY=$GATEWAY}"?/lianxi/ifcfg-eth0echo?"The?IP?is?alter:$IP" fi內(nèi)容大部分來自:
http://c.biancheng.net/view/4028.html
https://blog.csdn.net/qq_18312025/article/details/78231015
https://www.gnu.org/software/sed/manual/sed.html#Multiline-techniques
總結(jié)
以上是生活随笔為你收集整理的LINUX SHELL的神器,sed的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫qq付费音乐_Pytho
- 下一篇: Linux利器:QEMU!用它模拟开发板