日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

LINUX SHELL的神器,sed

發(fā)布時間:2023/12/20 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LINUX SHELL的神器,sed 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們知道,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á)式)substitution

    1.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.conf

    3.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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。