目錄
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'