SED 必殺技一例

2022-08-04 08:30:08 字數 4941 閱讀 1806

1.如何取得/etiantian檔案的許可權對應的數字內容,如-rw-r–r–為644,要求使用命令取得644或0644這樣的數字。

解答:這個問題的解答方法我們已經介紹了不下10種了,這裡給大家在深入淺出的講一下最難理解sed特殊用法加正則的實現。

由於難度比較大,為了讓同學們能了解的更清楚明白,我們需要先搭幾個台階。

表1-1 sed命令

命令功能

g與s聯合使用時,表示對當前行全域性匹配替換(與下乙個g意義不同)

p列印匹配行

s常說的查詢並替換,用乙個字串替換成另乙個

表1-2 sed選項

選項功能

-e允許多項編輯

-n取消預設輸出

台階2:sed替換基本命令

sed -n 『s#▇#▲#g』 oldboy.log

[root@oldboy ~]# cat oldboy.log

執行下面命令把▇替換為▲,注意:原檔案沒變。

[root@oldboy ~]# sed 『s#▇#▲#g』 oldboy.log   

台階3:正規表示式基本用法(三劍客grep,sed,awk都支援正規表示式)

特殊字元

含義與例子

^word

搜尋以字元(word)開頭的行。

例:grep -v 『^#』 oldboy.log

過濾掉以#行首(開始)的行,一般檢視配置檔案時會用到。

word$

搜尋以字元(word)結尾的行。

例:grep -n『!$』oldboy.log

搜尋以!(嘆號)結尾的行

.(點號)

代表切只能代表「任意乙個」字元,「乙個」是乙個任意字元

例:grep -n 『e.e』 oldboy.log

搜尋的字串可以是(eve),(eae),(eee),(e e),但不能僅有(ee)即e與e之間一定且僅有乙個字元,而空格符也是字元

重複零個或多個的前乙個重複字元

例:grep -n 『ess*』 oldboy.log

找出含有(es),(ess),(esss)等的字串,注意,因為(*)可以是0個,所以es     也是符合搜尋字串。另外,因為(*)為重複「前乙個字元」的符號,因此,在(*)之前必須要緊接乙個重複字元。任意字元則為(.*)

根據前面的單個字元,我們知道.*匹配所有字串

台階4:sed中\( \)和\1的功能

1)sed的\( \)的功能可以記住正規表示式的一部分,其中,\1為第乙個記住的模式即第乙個小括號中的匹配內容,\2第二記住的模式,即第二個小括號中的匹配內容,sed最多可以記住9個。

例1:echo i am oldboy teacher.

如果你想保留一行的單詞,刪除剩下的部分,使用圓括號標記想保留的部分:

本例我們要保留oldboy把其他內容刪除。

[root@oldboy ~]# echo i am oldboy teacher. >test.txt

[root@oldboy ~]# cat test.txt

i am oldboy teacher.

[root@oldboy ~]# sed 『s#^.*am \([a-z].*\) tea.*$#\1#g』 test.txt                          

oldboy

命令說明:#命令說明中的□代替空格

a)^.*am□     –>這句的意思是以任意字元開頭到am□為止,匹配檔案中的「i am□」字串,

b)\([a-z].*\)□–>這句的外殼就是括號\(\),裡面的[a-z]表示匹配26個字母的任何乙個,[a-z].* 合起來就是匹配任意多個字元,本題來說就是匹配oldboy字串,由於oldboy字串是需要保留的,因此用括號括起來匹配,後面通過\1來取oldboy字串。

c)□tea.*$     –>表示以空格tea起始任意字元結尾,實際就是匹配oldboy字串後,緊接著的字串「□teacher.」.

d)後面被替換的內容中的\1就是取前面的括號裡的內容了,也就是我們要的oldboy字串。

其實啊,你上了本台階,本文的主題答案你就該會了。

台階5:取字串的技巧 ==>這個台階的思路技巧是最重要的,也是老男孩linux培訓課程深入淺出的乙個小案例。

[root@oldboy ~]# stat /ett|sed -n 『4p』

access: (0644/-rw-r–r–)  uid: (    0/    root)   gid: (    0/    root)

1)處理需要的目標(獲取的字串如本文開篇的644)前的字串一般用以..開頭(^.*)來匹配開頭,匹配的目標前的結尾寫上實際的字元,如:「^.*(0」表示式匹配「access: (0」,說到這先給個例子:

[root@oldboy ~]# stat /ett|sed -n 『4p』|sed 『s#^.*(0##g』

644/-rw-r–r–)  uid: (    0/    root)   gid: (    0/    root)

大家看到了吧,644前面的部分已經被刪除了。

2)而處理目標後的內容一般在緊接著目標後匹配的開頭寫上實際的字元,而結尾是用以…結尾(.*$)來匹配,如「/-r.*$」表示式匹配「/-rw-r–r–)  uid: (    0/    root)   gid: (    0/    root)」在來個例子:

[root@oldboy ~]#  stat /ett|sed -n 『4p』|sed 『s#/-r.*$##g』

access: (0644

哈哈,這次644後面的又被刪除了。

有一點要注意,就是實際字元的選取最好要唯一,因為正規表示式是貪婪的,它總是盡可能的匹配更遠的符合匹配的內容。另外不要落了字串中的空格。

合起來就是答案了。

[root@oldboy ~]# stat /ett|sed -n 『4p』|sed 『s#^.*(0##g』|sed 『s#/-r.*$##g』

先刪除目標前面的,在刪除目標後的,這是應用了兩次sed,每次只匹配了一半,第一次匹配目標前,第二次匹配目標後,那麼能不能直接匹配整行字串呢?

所有的台階都上來後,接下來就引出本文的主題。

關鍵人物出場:

有了前面的台階,現在這道題就簡單多了,好先丟擲答案,然後在分析說明。

[root@oldboy ~]# stat /ett|sed -n 『s#^.*(0\([0-7].*\)\/-.*$#\1#gp』           

命令說明:

a)「^.*(0」匹配目標前的內容,這個不用再解釋了吧,這裡匹配的是「access: (0

b)「\/-.*$」 匹配目標後的內容,這個也不用再解釋了吧,這裡匹配的是「/-rw-r–r–)  uid: (    0/    root)   gid: (    0/    root)」

c)這中間的644就是我們要列印的結果,所以要用括號括起來呦,於是\(\)就不用再解釋了,[0-7].*就是匹配644,匹配到斜線/前為止,雖然不是精確匹配但是這裡夠用了。因此,「\([0-7].*\)」匹配的就是「644」了,前面的台階已經講過了,匹配模式中\(\)的內容,可以用\1來取出(如果是第二個擴號就是\2,類推),所以啊,644的結果就出來拉。

後記小結:

當然了,匹配方法不只這一種,還可以寫出很多種,但是老男孩老師給出的是偶自己總結的乙個易於初學者記憶的思路,如果大家有更好的記憶的方法,可以告訴我啊。

同學們可以拿取網絡卡的ip位址練手,檢驗下,看看你們的刀磨快了麼?哈哈!

附帶其他解決答案彙總:

[root@oldboy ~]# touch /ett

1)[root@oldboy ~]# stat /ett|sed -n 『4p』|awk -f 『[(/]』 『』

2)[root@oldboy ~]# stat /ett|sed -n 『4p』|cut -d 「/」 -f1|cut -d 「(」 -f2

3)[root@oldboy ~]# stat /ett|head -4|tail -1|cut -d 「/」 -f1|cut -d 「(」 -f2

4)[root@oldboy ~]#  stat /ett|head -4|tail -1|awk -f 「/」 『』|awk -f 「(」 『』

5)[root@oldboy ~]# stat -c %a /ett

6)[root@oldboy ~]# stat /ett|sed -n 『4p』|sed 『s#^.*(0##g』|sed 『s#/-.*$##g』

6447)

[root@oldboy ~]# stat /ett|sed -n 『s#^.*(0\([0-7].*\)\/-.*$#\1#gp』            

6448)

[root@oldboy ~]# stat /ett|sed -n 『4p』|sed -ne 『s/^.* (0\([^ ]*\)\/-.*$/\1/gp』

9)[root@oldboy ~]# stat /ett|sed -n 『/access: (/p』|sed -r 『s/^.*\(0(.*)\/-.*$/\1/』

[root@oldboy ~]# stat /ett|sed -n 『4p』|sed -e 『s/^access: (\([0-9]*\)\/-rw-r.*$/\1/g』    

10)[root@oldboy ~]# stat /ett|grep 「access: (0″|cut -c 10-13

[root@oldboy ~]# stat /etc/hosts|sed -nr 『4s#^.*\(0(.*)/-.*$#\1#gp』

SQL注入漏洞攻防必殺技

sql注入不完全思路與防注入程式 一 sql注入簡介 許多 程式在編寫時,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可 以提交一段資料庫查詢 一般是在瀏覽器位址列進行,通過正常的www埠訪問 根據程式返回的結 果,獲得某些他想得知的資料,這就是所謂的sql injectio...

SQL注入漏洞,攻防必殺技!

29 20 65 78 65 63 20 6d 61 73 74 65 72 2e 64 62 6f 2e 78 70 5f 72 65 67 72 65 61 64 20 27 48 4b 45 59 5f 4c 4f 43 41 4c 5f 4d 41 43 48 49 4e 45 27 2c ...

拯救頻繁跳槽的必殺技!

對於任何乙個公司而言,員工的不穩定是最大的隱患,這不僅導致公司招聘成本的增加,也破壞了工作的延續性。所以在面試過程中,公司也會特別關注應聘者的跳槽頻率。我對於頻繁跳槽的人並沒有太多的鄙夷。很多任務作在應聘時是看不出好壞的。就像公司對新錄用的員工有乙個所謂的試用期,那麼員工也可以在 試用期 後因為自己...