21 Shell編程之正則表達式與文本處理器

目錄

21.1 正則表達式

? ? ? ? 21.1.1 正則表達式概述

? ? ? ? 21.1.2 基礎正則表達式

? ? ? ? 21.1.3 擴展正則表達式

21.2 文本處理器

? ? ? ? 21.2.1 sed工具

? ? ? ? 21.2.2 awk工具

? ? ? ? 21.2.3 sort工具

? ? ? ? 21.2.4 uniq工具


21.1 正則表達式

? ? ? ? 21.1.1 正則表達式概述
? ? ? ? 1.正則表達式概述

? ? ? ? 正則表達式又稱正規表達式、常規表達式。在代碼中常簡寫為regex、regexp或RE。正則表達式是使用單個字符串來描述、匹配一系列符合某個句法的字符串,簡單來說,是一種匹配字符串的方法,通過一些特殊符號,實現快速查找、刪除、替換某個特定字符串。

? ? ? ? 正則表達式是由普通字符與元字符組成的文字模式。模式用于描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。其中普通字符包括大小寫字母、數字、標點符號及一些其它符號,元字符則是指那些正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式。

? ? ? ? 正則表達式一般用于腳本編程與文本編輯器中。很多文本處理器與程序設計語言均支持正則表達式,例如Linux系統中常進啊的文本處理器(grep、egrep、sed、awk)以及應用比較廣泛的Python語言。正則表達式具有很強大的文本匹配功能,能夠在文本中快速高效地處理文本。

? ? ? ? 2.正則表達式用途

? ? ? ? 正則表達式對于系統管理員來說是非常重要的,系統運行過程中或產生大量的信息,這些信息有些是非常重要的,有些則僅是告知的信息。身為系統管理員如果直接看這么多的信息數據,無法快速定位到重要的信息,如“用戶賬號登陸失敗”“服務啟動失敗”等信息。這時可以通過正則表達式快速提取“有問題”的信息。可以將運維工作變得更加簡單、方便。

? ? ? ? 目前很多軟件也支持正則表達式,最常見的就是郵件服務器。在Internet中,垃圾/廣告郵件經常會造成網絡塞車,如果在服務器端就將這些問題郵件提前剔除,客戶端就會減少很多不必要的帶寬消耗。而目前最常用的郵件服務器postfix以及支持郵件服務器的相關分析軟件都支持正則表達式的對比功能。將來信的標題、內容與特殊字符進行對比,發現問題郵件就過濾掉。

? ? ? ? 除郵件服務器之外,很多服務器軟件都支持正則表達式,但是需要管理員手動編寫。

? ? ? ? 21.1.2 基礎正則表達式

? ? ? ? 正則表達式的字符串表達方式根據不同的嚴謹程度與功能分為基本正則表達式與擴展正則表達式。基礎正則表達式是常用正則表達式最基礎的部分。

? ? ? ? 1.基礎正則表達式示例

? ? ? ? 下面的操作需要提前準備一個名為test.txt的測試文件,文件具體內容如下:

[root@localhost ~]# cat test.txt
he was short and fat.
he was weating a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
PI=3.14
a wood cross!
Actions speak louder than words#woood #
#woooooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
? ? ? ? (1)?查找特定字符

? ? ? ? 查找特定字符非常簡單,執行以下命令即可從test.txt文件中查找出特定字符“the”所在位置。其中“-n”表示顯示行號、“-i”表示不區分大小寫。命令執行后,符號匹配標準的字符,字體顏色會變為紅色。

[root@localhost ~]# grep -ni 'the' test.txt 
3:The home of Football on BBC Sport online.
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword.

?????????若反向選擇,如查找不包含"the”字符的行,則需要通過 grep 命令的"-v"選項實現,并配合“-n”一起使用顯示行號。

[root@localhost ~]# grep -ni 'the' test.txt 
3:The home of Football on BBC Sport online.
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword.
[root@localhost ~]# grep -vn 'the' test.txt 
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
3:The home of Football on BBC Sport online.
6:PI=3.14
7:a wood cross!
8:Actions speak louder than words
9:
10:#woood #
11:#woooooooood #
12:AxyzxyzxyzxyzC
13:I bet this place is really spooky late at night!
14:Misfortunes never come alone/single.
15:I shouldn't have lett so tast.
? ? ? ? (2)利用中括號“[]”來查找集合字符?

????????想要查找"shint"與"short”這兩個字符串時,可以發現這兩個字符串均包含"sh"與"rt”。此時執行以下命令即可同時查找到"shint"與"shor"這兩個字符串,其中"["中無論有幾個字符,都僅代表一個字符,也就是說“[io]"表示匹配“i”或者“o”。

[root@localhost ~]# grep -n 'sh[io]rt' test.txt 
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.

????????若要查找包含重復單個字符“00"時,只需要執行以下命令即可。

[root@localhost ~]# grep -n 'oo' test.txt 
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
7:a wood cross!
10:#woood #
11:#woooooooood #
13:I bet this place is really spooky late at night!

????????若查找“00”前面不是"w"的字符串,只需要通過集合字符的反向選擇"[^1"來實現該目的。例如執行“grep -n'[^w]oo'test.txt"命令表示在 test.txt 文本中査找“o0”前面不是“w"的字符串。

[root@localhost ~]# grep -n '[^w]oo' test.txt 
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
10:#woood #
11:#woooooooood #
13:I bet this place is really spooky late at night!

?????????在上述命令的執行結果中發現“woood"與"wooooood"也符合匹配規則,二者均包含"w"。其實通過執行結果就可以看出,符合匹配標準的字符加粗顯示,而上述結果中可以得知,“#woood #"中加粗顯示的是“000”,而“o0”前面的“o”是符合匹配規則的。同理“#woooooood #也符合匹配規則。
????????若不希望“o0”前面存在小寫字母,可以使用“grep -n[^a-z]ootest.txt”命令實現,其中"a-z"表示小寫字母,大寫字母則通過“A-Z”表示。

[root@localhost ~]# grep -n '[^a-z]oo' test.txt 
3:The home of Football on BBC Sport online.

? ? ? ? 查找包含數字的行可以通過以下命令實現。

[root@localhost ~]# grep -n '[0-9]' test.txt 
4:the tongue is boneless but it breaks bones.12!
6:PI=3.14
? ? ? ? ?(3)查找行首“^”與行尾字符“$”

????????基礎正則表達式包含兩個定位元字符:“^”(行首)與“$”(行尾)。在上面的示例中,查詢“the”字符串時出現了很多包含“the”的行,如果想要査詢以“the”字符串為行首的行,則可以通過“^”元字符來實現。

[root@localhost ~]# grep -n '^the' test.txt 
4:the tongue is boneless but it breaks bones.12!

?????????查詢以小寫字母開頭的行可以通過“^[a-z]"規則來過濾,查詢大寫字母開頭的行則使用“^[A-Z]"規則,若查詢不以字母開頭的行則使用“^[^a-zA-Z]”規則。

[root@localhost ~]# grep -n '^[a-z]' test.txt 
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword.
7:a wood cross![root@localhost ~]# grep -n '^[A-Z]' test.txt 
3:The home of Football on BBC Sport online.
6:PI=3.14
8:Actions speak louder than words
12:AxyzxyzxyzxyzC
13:I bet this place is really spooky late at night!
14:Misfortunes never come alone/single.
15:I shouldn't have lett so tast.[root@localhost ~]# grep -n '^[A-Z a-z]' test.txt 
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
3:The home of Football on BBC Sport online.
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword.
6:PI=3.14
7:a wood cross!
8:Actions speak louder than words
12:AxyzxyzxyzxyzC
13:I bet this place is really spooky late at night!
14:Misfortunes never come alone/single.
15:I shouldn't have lett so tast.

?????????“^”符號在元字符集合“[”符號內外的作用是不一樣的,在"[]”符號內表示反向選擇,在"符號外則代表定位行首。反之,若想查找以某一特定字符結尾的行則可以使用“$”定位符。例如,執行以下命令即可實現查詢以小數點(.)結尾的行。因為小數點(.)在正則表達式中也是一個元字符(后面會講到),所以在這里需要用轉義字符""將具有特殊意義的字符轉化成普通字符。

[root@localhost ~]# grep -n '\.$' test.txt 
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
14:Misfortunes never come alone/single.
15:I shouldn't have lett so tast.

? ? ? ? 當查詢空白行時,執行以下命令即可。

[root@localhost ~]# grep -n '^$' test.txt 
9:
? ? ? ? ?(4)查找任意一個字符“.”與重復字符“*”

????????前面提到,在正則表達式中小數點(.)也是一個元字符,代表任意一個字符。例如執行以下命令就可以查找“w??d”的字符串,即共有四個字符,以 w開頭 d結尾。

[root@localhost ~]# grep -n 'w..d' test.txt 
5:google is the best tools for search keyword.
7:a wood cross!
8:Actions speak louder than words

????????在上述結果中,“wood"字符串"w..d”匹配規則。若想要査詢 00、000、00000 等資料,則需要使用星號(*)元字符。但需要注意的是,"*”代表的是重復零個或多個前面的單字符。"o*"表示擁有零個(即為空字符)或大于等于一個“o”的字符,因為允許空字符,所以執行"grep-n'o” test.txt"命令會將文本中所有的內容都輸出打印。如果是"oo*",則第一個。必須存在,第二個o則是零個或多個 0,所以凡是包含 0、00、000、000,等的資料都符合標準。同理,若查詢包含至少兩個0以上的字符串,則執行以下命令即可。?

[root@localhost ~]# grep -n 'ooo*' test.txt 
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
7:a wood cross!
10:#woood #
11:#woooooooood #
13:I bet this place is really spooky late at night!

????????查詢以w開頭d結尾,中間包含至少一個0的字符串,執行以下命令即可實現。

[root@localhost ~]# grep -n 'woo*d' test.txt 
7:a wood cross!
10:#woood #
11:#woooooooood #

? ? ? ? ?執行以下命令即可查詢任意數字所在行。

[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt 
4:the tongue is boneless but it breaks bones.12!
6:PI=3.14
? ? ? ? (5)查找連續字符范圍“{}”?

????????在上面的示例中,使用了".”與“*”來設定零個到無限多個重復的字符,如果想要限制一個范圍內的重復的字符串該如何實現呢?例如,查找三到五個o的連續字符,這個時候就需要使用基礎正則表達式中的限定范圍的字符“{}”。因為""在 Shel 中具有特殊意義,所以在使用““"字符時,需要利用轉義字符“",將“”字符轉換成普通字符。""字符的使用方法如下所示。

? ? ? ? 1.查詢兩個o的字符

[root@localhost ~]# grep -n 'o\{2\}' test.txt 
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
7:a wood cross!
10:#woood #
11:#woooooooood #
13:I bet this place is really spooky late at night!

? ? ? ? 2.查詢以w開頭以d結尾,中間包含2~5個o的字符串。

[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt 
7:a wood cross!
10:#woood #

? ? ? ? ?3.查詢以w開頭以d結尾,中間包含2個或2個以上o的字符串。

[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt 
7:a wood cross!
10:#woood #
11:#woooooooood #
? ? ? ? 2.元字符總結?

????????通過上面幾個簡單的示例,可以了解到常見的基礎正則表達式的元字符主要包括以下幾個。

?

? ? ? ? 21.1.3 擴展正則表達式

????????通常情況下會使用基礎正則表達式就已經足夠了,但有時為了簡化整個指令,需要使用范圍更廣的擴展正則表達式。例如,使用基礎正則表達式查詢除文件中空白行與行首為”#“之外的行(通常用于查看生效的配置文件),執行“grep -v^$test.txt |grep -v^#""即可實現。這里需要使用管道命令來搜索兩次。如果使用擴展正則表達式,可以簡化為"egrep-V^$|^#'test.txt”,其中,單引號內的管道符號表示或者(or)。

????????此外,grep命令僅支持基礎正則表達式,如果使用擴展正則表達式,需要使用 egrep或 awk 命令。awk 命令在后面的小節進行講解,這里我們直接使用 egrep 命令。egrep 命令與 grep 命令的用法基本相似。egrep 命令是一個搜索文件獲得模式,使用該命令可以搜索文件中的任意字符串和符號,也可以搜索一個或多個文件的字符串,一個提示符可以是單個字符、一個字符串、一個字或一個句子。

????????與基礎正則表達式類型相同,擴展正則表達式也包含多個元字符,常見的擴展正則表達
式的元字符主要包括以下幾個。

21.2 文本處理器

????????在 Linux/UNIX 系統中包含很多種類的文本處理器或文本編輯器,其中包括我們之前學習過的 VIM 編輯器與 grep 等。而 grep,sed,awk 更是 Shel 編程中經常用到的文本處理工具,被稱之為 Shel 編程三劍客。

? ? ? ? 21.2.1 sed工具

????????sed(Stream EDitor)是一個強大而簡單的文本解析轉換工具,可以讀取文本,并根據指定的條件對文本內容進行編輯(刪除、替換、添加、移動等),最后輸出所有行或者僅輸出處理的某些行。sed 也可以在無交互的情況下實現相當復雜的文本處理操作,被廣泛應用于 Shel 腳本中,用以完成各種自動化處理任務。

? ? ? ? sed的工作流程主要包括讀取、執行和顯示三個過程。

? ? ? ? 1.讀取:sed 從輸入流(文件、管道、標準輸入)中讀取一行內容并存儲到臨時的緩沖區中(又稱模式空間,pattem space)。

? ? ? ? 2.執行:默認情況下,所有的 sed 命令都在模式空間中順序地執行,除非指定了行的地址,否則 sed 命令將會在所有的行上依次執行。

? ? ? ? 3.顯示:發送修改后的內容到輸出流。在發送數據后,模式空間將會被清空在所有的文件內容都被處理完成之前,上述過程將重復執行,直至所有內容被處理完。

? ? ? ? 在所有文件內容都被處理完成之前,上述過程將重復執行,直至所有內容被處理完。

? ? ? ? 注意:默認情況下所有的 sed 命令都是在模式空間內執行的,因此輸入的文件并不會發生任何變化,除非是用重定向存儲輸出。

? ? ? ? 1.sed命令常見用法

????????通常情況下調用 sed 命令有兩種格式,如下所示。其中,“參數"是指操作的目標文件,當存在多個操作對象時用,文件之間用逗號“,"分隔;而 scriptfile 表示腳本文件,需要用"-f選項指定,當腳本文件出現在目標文件之前時,表示通過指定的腳本文件來處理輸入的目標文件。

sed [選項] '操作' 參數
sed [選項] -f scriptfile 參數

? ? ? ? 常見?的sed命令選項主要包括以下幾種。

? ? ? ? 1.e或-expression=:表示用指定命令或者腳本來處理輸入的文本文件。

? ? ? ? 2.-f或--file=:表示用指定的腳本文件來處理輸入的文本文件。

? ? ? ? 3.-h或--help:顯示幫助。

? ? ? ? 4.-n、--quiet 或 silent:表示僅顯示處理后的結果。

? ? ? ? 5.-i:直接編輯文本文件。

????????“操作”用于指定對文件操作的動作行為,也就是 sed 的命令。通常情況下是采用的[n1[,n2]]"操作參數的格式。n1、n2 是可選的,代表選擇進行操作的行數,如操作需要在 5~20 行之間進行,則表示為“5,20 動作行為"。常見的操作包括以下幾種。

? ? ? ? 1.a:增加,在當前行下面增加一行指定內容。

? ? ? ? 2.c:替換,將選定行替換為指定內容。

? ? ? ? 3.d:刪除,刪除選定的行。

? ? ? ? 4.i:插入,在選定行上面插入一行指定內容。

? ? ? ? 5.p:打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容;如果有非打印字符,則以ASCLL碼輸出。其通常與”-n“選項一起使用

? ? ? ? 6.s:替換,替換指定字符。

? ? ? ? 7.y:字符轉換。

? ? ? ? 2.用法示例

? ? ? ? (1)輸出符合條件的文本(p表示正常輸出)

sed -n 'p' test.txt 


sed -n '3p' test.txt


sed -n '3,5p' test.txt


sed -n 'p;n' test.txt


sed -n 'n;p' test.txt 



?

sed -n '1,5{p;n}' test.txt

sed -n '10,${n;p}' test.txt


????????在執行“sed -n'10,$(n;p}test.txt”命令時,讀取的第1行是文件的第 10 行,讀取的第 2行是文件的第 11 行,依此類推,所以輸出的偶數行是文件的第 11 行、13 行直至文件結尾,其中包括空行。
????????以上是 sed 命令的基本用法,sed 命令結合正則表達式時,格式略有不同,正則表達式以“/”包圍。例如,以下操作是 sed 命令與正則表達式結合使用的示例。
?

sed -n '/the/p' test.txt

sed -n '4,/the/p' test.txt

?

sed -n '/the/=' test.txt

sed -n '/the/=' test.txt

?

sed -n '/[0-9]$/p' test.txt

sed -n '/\<wood\>/p' test.txt

?(2)刪除符合條件的文本(d)

????????因為后面的示例還需要使用測試文件 test.txt,所以在執行刪除操作之前需要先將測試文件備份。以下示例分別演示了 sed 命令的幾種常用刪除用法。
????????下面命令中nl命令用于計算文件的行數,結合該命令可以更加直觀地查看到命令執行的結果。

nl test.txt | sed '3d'

?

nl test.txt | sed '3,5d'

?

nl test.txt |sed '/cross/d'

?

sed '/^[a-z]/d' test.txt

sed '/\.$/d' test.txt

?

sed "^$/d" test.txt

????????注意:若是刪除重復的空行,即連續的空行只保留一個,執行“sed-e'/^$/{n;/^$/d}test.txt"命令即可實現。其效果與“cat -s test.txt”相同,n 表示讀下一行數據。

(3)替換符合條件的文本

????????c(整行/整塊替換)、y在使用 sed 命令進行替換操作時需要用到s(字符串替換)、(字符轉換)命令選項,常見的用法如下所示。

sed 's/the/THE/ test.txt        //將每行中的第一個 the 替換為 THE
sed 's/l/L/2' test.txt         //將每行中的第2個|替換為L
sed 's/the/THE/g' test.txt    //將文件中的所有 the 替換為 THE
sed 's/o//g' test.txt        //將文件中的所有o刪除(替換為空串)
sed 's/^/#/' test.txt       //在每行行首插入#號
sed '/the/s/^/#/" test.txt    //在包含 the 的每行行首插入#號
sed 's/$/EOF/ test.txt        //在每行行尾插入字符串 EOF
sed '3,5s/the/THE/g' test.txt    //將第 3~5 行中的所有 the 替換為 THE
sed '/thels/o/O/g" test.txt     //將包含 the 的所有行中的·都替換為 O

(4)遷移符合條件的文本

??????? 在使用sed命令遷移符合條件的文本時,常用到以下參數

  • H:復制到剪貼板;
  • g、G:將剪貼板中的數據覆蓋/追加至指定行;
  • w:保存為文件;
  • r:讀取指定文件;
  • a:追加指定內容。
sed '/the/{H;d};$G' test.txt    //將包含 the 的行遷移至文件末尾,{;}用于多個操作
sed '1,5{H;d};17G' test.txt    //將第 1~5 行內容轉移至第 17 行后
sed '/the/w out.file test.txt    //將包含 the 的行另存為文件 out.file
sed '/the/r /etc/hostname test.txt    //將文件/etc/hostname 的內容添加到包含 the 的每行以后
sed '3aNew' test.txt    //在第3 行后插入一個新行,內容為 New
sed '/the/aNew' test.txt    //在包含 the 的每行后插入一個新行,內容為 New
sed '3aNew1inNew2' test.txt    //在第3行后插入多行內容,中間的\n 表示換行

?

(5)使用腳本編輯文件

??????? 使用sed腳本將多喝編輯指令存放到文件中(每行一條編輯指令),通過”-f“選項來調用。例如執行以下命令即可將第1~5行內容轉移到第17行后。

sed '1,5{H;d};17G' test.txt    //將第 1~5 行內容轉移至第 17 行后

??????? 以上操作可以改用腳本文件方式

vim opt.list
sed -f opt.list test.txt     

(6)sed直接操作文件示例

??????? 編寫一個腳本,用來調整vsftpd服務配置,要求禁止匿名用戶,但允許本地用戶(也允許寫入)。

?

vim local _only_ftp.sh
chmod +x local only_ftp.sh

? ? ? ? 21.2.2 awk工具

????????在 Linux/UNIX 系統中,awk是一個功能強大的編輯工具,逐行讀取輸入文本,并根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,可以在無交互的情況下實現相當復雜的文本操作,被廣泛應用于 Shel 腳本,完成各種自動化配置任務。

1.awk常見用法

??????? 通常情況下awk所使用的命令格式如下所示,其中,單引號加上大括號”{}“用于設置對數據進行的處理動作。awk可以直接處理目標文件,也可以通過”-f“讀取腳本對目標文件進行處理

awk 選項模式或條件{編輯指令}文件1文件 2..    //過濾并輸出文件中符合條件的內容
awk -f 腳本文件 文件1 文件 2...            //從腳本中調用編輯指令,過濾并輸出內容

????????前面提到 sed 命令常用于一整行的處理,而 awk 比較傾向于將一行分成多個“字段”然后再進行處理,且默認情況下字段的分隔符為空格或 tab 鍵。awk執行結果可以通過 print 的功能將字段數據打印顯示。在使用 awk 命令的過程中,可以使用邏輯操作符“&&"表示“與”、”||“表示“或”、“!"表示“非”;還可以進行簡單的數學運算,如+、-、*、/、%、^分別表示加、減、乘、除、取余和乘方。

????????在 Linux 系統中/etc/passwd 是一個非常典型的格式化文件,各字段間使用“:”作為分隔符隔開,Linux 系統中的大部分日志文件也是格式化文件,從這些文件中提取相關信息是運維的日常工作內容之一。若需要査找出/etc/passwd 的用戶名、用戶 ID、組 ID 等列,執行以下 awk 命令即可。

awk -F': '{print $1,$3,$4}'/etc/passwd

?????????awk 從輸入文件或者標準輸入中讀入信息,與sed 一樣,信息的讀入也是逐行讀取的。不同的是 awk 將文本文件中的一行視為一個記錄,而將一行中的某一部分(列)作為記錄中的一個字段(域)。為了操作這些不同的字段,awk 借用shell 中類似于位置變量的方法,用$1、$2、$3...順序地表示行(記錄)中的不同字段。另外 awk用$0 表示整個行(記錄)。不同的字段之間是通過指定的字符分隔。awk 默認的分隔符是空格。awk允許在命令行中用“-F 分隔符"的形式來指定分隔符

awk包含幾個特殊的內建變量:

  • FS:指定每行文本的字段分割符,默認為空格或制表位
  • NF:當前處理的行的字段個數
  • NR:當前處理的行的行號(序數)
  • $0:當前處理的行的整行內容
  • $n:當前處理行的第n個字段(第n列)
  • FILENAME:被處理的文件名
  • RS:數據記錄分隔,默認位\n,即每行位一條記錄

2.用法示例

(1)按行輸出文本

awk '{print}' test.txt    //輸出所有內容,等同于 cat test.txt
awk '{print $0}' test.txt    //輸出所有內容,等同于 cat test.txt
awk'NR==1,NR==3{print}' test.txt    //輸出第 1~3 行內容
awk'(NR>=1)&&(NR<=3){print}' test.txt    //輸出第 1~3 行內容
awk'NR==1|NR==3{print}' test.txt    //輸出第1 行、第 3行內容
awk'(NR%2)==1{print} test.txt    //輸出所有奇數行的內容
awk'(NR%2)==0{print}' test.txt    //輸出所有偶數行的內容
awk '/^root{print}" /etc/passwd    //輸出以 root 開頭的行
awk '/nologin$/{print}"/etc/passwd    //輸出以 nologin 結尾的行
awk'BEGIN {x=0};/binVbash$/{x++};END {print x}'/etc/passwd    //統計以/bin/bash 結尾的行數,等同于 grep-c"/bin/bash$"/etc/passwd
awk 'BEGIN{RS=""};END{print NR}' /etc/squid/squid.conf    //統計以空行分隔的文本段落數

(2)按字段輸出文本

(3)通過管道、雙引號調用Shell命令

?

? ? ? ? 21.2.3 sort工具

????????在 Linux 系統中,常用的文件排序工具有三種:sort、unig、wc。本章將介紹前兩種工具的用法。
????????sort是一個以行為單位對文件內容進行排序的工具,也可以根據不同的數據類型來排序。例如數據和字符的排序就不一樣。sort 命令的語法為"sort[選項]參數”,其中常用的選項包括以下幾種。

  • -f:忽略大小寫;
  • -b:忽略每行前面的空格;
  • -M:按照月份進行排序;
  • -n:按照數字進行排序;
  • -r:反向排序;
  • -u:等同于 unig,表示相同的數據僅顯示一行;
  • -t:指定分隔符,默認使用[Tab]鍵分隔;
  • -o<輸出文件>:將排序后的結果轉存至指定文件;
  • -k:指定排序區域

示例一:將/etc/passed文件中的賬號進行排序

sort /etc/passwd

示例二:將/etc/passwd文件中第三列進行反向排序

sort -t':'-rk3 /etc/passwd

?示例三:將/etc/passed文件中第三列進行排序,并將輸出內容保存至user.txt文件中

sort -t':'-k 3 /etc/passwd -o user.txt
cat user.txt
? ? ? ? 21.2.4 uniq工具

??????? Uniq工具在Linux系統中通常與sort命令相結合,用于報告或忽略文件中重復的行。具體語法格式為:uniq[選項]參數。選項包含

  • -c:進行計數;
  • -d:僅顯示重復行;
  • -u:僅顯示出現一次的行。

示例一:刪除testfile文件中的重復行

cat testfile
uniq testfile

示例二:刪除testfile文件中的重復行,并在行首顯示改行重復出現的次數

uniq -c testfile

示例三:查找testfile文件中的重復行

uniq -d testfile

21.2.5?tr工具

????????tr命令常用來對來自標準輸入的字符進行替換、壓縮和刪除。可以將一組字符替換之后變成另一組字符,經常用來編寫優美的單行命令,作用很強大。

??????? tr具體的命令語法格式為:

tr [選項] [參數]

??????? 常用選項包括

  • -c:取代所有不屬于第一字符集的字符
  • -d:刪除所有屬于第一字符集的字符;
  • -s:把連續重復的字符以單獨一個字符表示;
  • -t:先刪除第一字符集較第二字符集多出的字符。

示例一:將輸入字符由大寫轉換小寫

echo "KGC" | tr 'A-Z' 'a-z'

示例二:壓縮輸入中重復的字符

echo "thissss is            a text linnnnnnne." |tr -s 'sn'

示例三:刪除字符中某些字符

echo 'hello world'  tr -d 'od'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35329.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

離線部署OpenIM

目錄 1.提取相關安裝包和鏡像 2.安裝docker和docker-compose 3.依次導入鏡像 4.解壓安裝包 5.執行安裝命令 6.PC Web 驗證 7.開放端口 7.1IM 端口 7.2Chat 端口 7.3 PC Web 及管理后臺前端資源端口 “如果您在解決類似問題時也遇到了困難&#xff0c;希望我的經驗分享…

HTML+CSS 彩色浮雕按鈕

效果演示 實現了一個彩色按鈕特效&#xff0c;包括一個按鈕&#xff08;button&#xff09;和一個前景色&#xff08;::before&#xff09;。按鈕具有四種不同的顏色&#xff0c;當鼠標懸停在按鈕上時&#xff0c;前景色會出現漸變效果&#xff0c;并且按鈕的顏色、文本陰影和邊…

Windows 獲取打印機及端口號方法 (C#)

1. 打開注冊表編輯器 regedit 2.選擇如下配置 計算機\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Device 3. 代碼 C# using System; using Microsoft.Win32;class Program {static void Main(){string registryPath "SOFTWARE\Microsoft\Windows …

優選算法2

五、位運算 常見位運算總結 &&#xff1a;有0就是0&#xff1b; |&#xff1a;有1就是1 ^&#xff1a;相同為0&#xff0c;相異就是1/無進位相加 給定一個數n,確定它的二進制表示中的第x位是0還是1&#xff1a;二進制中權值最小的是第0位&#xff0c;所以int整型是從第0位到…

堅持100天學習打卡Day1

1.大小端 2.引用的本質 及 深拷貝與淺拷貝 3.初始化列表方式 4.類對象作為類成員 5.靜態成員 static

vue3使用v-html實現文本關鍵詞變色

首先看應用場景 這有一段文本內容&#xff0c;是項目的簡介&#xff0c;想要實現將文本中的關鍵詞進行變色處理 有如下關鍵詞 實現思路 遍歷文本內容&#xff0c;找到關鍵詞&#xff0c;并使用某種方法更改其字體樣式。經過搜尋資料決定采用v-html實現&#xff0c;但是v-h…

解決pycharm安裝dlib失敗的問題

今天使用pycharm來學習opencv人臉識別庫face-recognition的時候出現了一點小問題&#xff0c;在pycharm中直接安裝face-recognition會失敗&#xff0c;說是因為缺少依賴庫dlib&#xff0c;但是直接使用pycharm安裝dlib庫也有問題&#xff0c;不知道大家遇到沒有 錯誤提示 note…

【深度學習】菜品目標檢測軟件系統

深度學習類文章回顧 【YOLO深度學習系列】圖像分類、物體檢測、實例分割、物體追蹤、姿態估計、定向邊框檢測演示系統【含源碼】 【深度學習】物體檢測/實例分割/物體追蹤/姿態估計/定向邊框/圖像分類檢測演示系統【含源碼】 【深度學習】YOLOV8數據標注及模型訓練方法整體流程…

AI智能寫作工具,AI寫作助手大全

隨著人工智能技術的快速發展&#xff0c;AI智能寫作工具助手已成為學術研究、內容創作和商業文案等領域的重要輔助工具。它們不僅能夠提高寫作效率&#xff0c;還能激發創意靈感&#xff0c;為各行各業的專業人士提供了強大的支持。下面小編將為大家全面介紹目前市場上備受矚目…

[C#][opencvsharp]C#使用opencvsharp進行年齡和性別預測支持視頻圖片檢測

使用 OpenCVSharp 來調用 age_net.caffemodel 和 gender_net.caffemodel 來進行性別和年齡預測涉及幾個步驟。以下是一個簡化的流程和示例文案&#xff1a; 1. 準備工作 確保你已經安裝了 OpenCVSharp 和相關的依賴項。確保你有 age_net.prototxt、age_net.caffemodel、gende…

大數據面試必問的數據治理面試題大全及參考答案

什么是數據治理?它與數據管理的區別是什么? 數據治理是組織內數據的系統性管理策略,它確保數據在整個生命周期中的可用性、準確性、安全性和合規性。數據治理不僅關乎技術實施,更是關于組織結構、政策、流程和標準的建立,以指導數據的收集、存儲、處理、保護和利用。它關…

代碼隨想錄算法跟練 | Day10 | 棧與隊列 Part01

個人博客主頁&#xff1a;http://myblog.nxx.nx.cn 代碼GitHub地址&#xff1a;https://github.com/nx-xn2002/Data_Structure.git Day10 232. 用棧實現隊列 題目鏈接&#xff1a; https://leetcode.cn/problems/implement-queue-using-stacks/ 題目描述&#xff1a; 請你僅…

在 Debian 服務器上安裝和配置 Apache Tomcat 的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 介紹 Apache Tomcat 是一個應用服務器&#xff0c;可用于向 web 用戶提供 Java 應用程序。它是由 Sun Microsystems 開發的 Java Servle…

詳解SpringSecurity中的Filter Chain

在Spring Security中&#xff0c;Filter Chain&#xff08;過濾器鏈&#xff09;是實現請求安全控制的核心。Spring Security的安全框架是建立在Servlet過濾器的基礎上的&#xff0c;通過一系列過濾器來實現不同的安全特性&#xff0c;如認證、授權等。 什么是Filter Chain F…

正版軟件 | 『閃點清單』— 您的智能懸浮任務管理專家

在繁忙的日常中&#xff0c;我們經常需要一個既能隨時提醒&#xff0c;又不會打擾我們的待辦事項管理工具。『閃點清單』&#xff0c;一款簡約而不簡單的懸浮清單軟件&#xff0c;為您帶來全新的任務管理體驗。 設計簡約&#xff0c;功能強大 『閃點清單』以其簡約的設計和強大…

CVPR講座總結(二)-探索圖像生成基礎模型的最新進展探索多模態代理的最新進展:從視頻理解到可操作代理

引言 在CVPR24上的教程中&#xff0c;微軟高級研究員Linjie Li為我們帶來了多模態代理的深入探索。這些代理通過整合多模態專家和大語言模型&#xff08;LLM&#xff09;來增強感知、理解和生成能力。本文總結了Linjie Li的講座內容&#xff0c;重點介紹了多模態記憶、可操作代…

供應鏈攻擊是什么?

隨著企業對技術和連接性的依賴日益增加&#xff0c;以及對第三方的普遍依賴&#xff0c;供應鏈攻擊變得越來越普遍。這些攻擊旨在通過供應商和商業伙伴損害企業。 供應鏈攻擊可能對企業和組織構成重大威脅&#xff0c;因為它們可能危及它們的安全以及向客戶提供的產品和服務的…

GPT-5或于一年半后發布?淺談智能的飛躍與未來

一、前言 IT之家6月22日消息&#xff0c;在美國達特茅斯工程學院周四公布的采訪中&#xff0c;OpenAI首席技術官米拉穆拉蒂被問及GPT-5是否會在明年發布&#xff0c;給出了肯定答案并表示將在一年半后發布。 技術的風暴從未停止&#xff0c;人工智能作為這場風暴中的旋風&…

ant-design-vue:Button的樣式不是藍色

ant-design-vue中a-button&#xff0c;設置的樣式是“primary”。但不是藍色。 解決方法&#xff1a;重新自定義樣式 參考鏈接&#xff1a; https://www.jianshu.com/p/0b2fde46c761 HTML&#xff1a; <a-buttonclass"c-button-primary"type"primary&quo…

《昇思25天學習打卡營第2天 | 張量 Tensor》

《昇思25天學習打卡營第2天 | 張量 Tensor》 《昇思25天學習打卡營第2天 | 張量 Tensor》 《昇思25天學習打卡營第2天 | 張量 Tensor》什么是張量&#xff08;Tensor&#xff09;張量的創建方式根據數據直接生成從NumPy數組生成使用init初始化器構造張量繼承另一個張量的屬性&a…