本章將和大家分享Linux系統中的管道命令、grep命令、sed命令和awk命令。廢話不多說,下麵我們直接進入主題。 一、管道命令 Linux 中的管道命令(pipe)是一種非常強大的特性,它允許你將一個命令的輸出作為另一個命令的輸入。管道命令極大地增強了命令行的靈活性和功能,使得複雜的數據處理任務 ...
本章將和大家分享Linux系統中的管道命令、grep命令、sed命令和awk命令。廢話不多說,下麵我們直接進入主題。
一、管道命令
Linux 中的管道命令(pipe)是一種非常強大的特性,它允許你將一個命令的輸出作為另一個命令的輸入。管道命令極大地增強了命令行的靈活性和功能,使得複雜的數據處理任務變得簡單。
1、基本語法
command1 | command2
command1 的輸出會被傳遞給 command2 作為其輸入。
可以鏈式使用多個管道命令,例如 command1 | command2 | command3。
2、示例
1)查看系統進程並按記憶體使用量排序
ps aux --sort=-%mem | less
這裡,ps aux --sort=-%mem 命令列出所有進程並按記憶體使用率降序排序,然後通過管道傳遞給 less 命令,使得你可以逐頁查看輸出。
2)查找包含特定文本的文件,並計算行數
grep '特定文本' 文件名 | wc -l
這裡,grep '特定文本' 文件名 命令查找文件中包含“特定文本”的行,然後將這些行傳遞給 wc -l 命令來計算行數。
3)查看當前目錄的文件和目錄,然後僅顯示目錄
ls -l | grep '^d'
ls -l 命令以長格式列出當前目錄的內容,然後通過管道傳遞給 grep '^d' 命令,後者僅匹配以 d(表示目錄)開頭的行。
4)使用多個管道進行複雜的數據處理
假設你有一個日誌文件,你想要找出所有錯誤消息(假設以 "ERROR" 開頭),並計算這些消息的數量,同時忽略大小寫:
grep -i 'error' 日誌文件.log | wc -l
這裡,grep -i 'error' 日誌文件.log 命令使用 -i 選項忽略大小寫地查找包含 "error" 的行,然後通過管道傳遞給 wc -l 命令來計數。
3、註意事項
- 管道命令中的每個命令都在其子 shell 中運行,因此它們之間的變數不是共用的。
- 管道命令中每個命令的輸入和輸出都是通過標準輸入(stdin)和標準輸出(stdout)進行的,除非特別重定向了輸入或輸出。
- 管道命令中的錯誤輸出(stderr)預設不會傳遞給下一個命令,除非使用重定向或特殊的命令(如 2>&1)來合併標準輸出和錯誤輸出。
二、grep命令
主要作用是文件過濾分割與合併,grep(global search regular expression(RE) and print out the line,全面搜索正則表達式並把行列印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行列印出來。
1、基本語法
grep [選項]... 模式 [文件]...
- 選項:可以調整 grep 的行為,如忽略大小寫、顯示匹配行的行號等。
- 模式:指定要搜索的文本模式,可以是簡單的字元串或複雜的正則表達式。
- 文件:指定要搜索的文件名。如果沒有指定文件名,grep 將從標準輸入讀取數據。
2、常用選項
- -i:忽略大小寫。
- -v:反向選擇,只顯示不匹配的行。
- -c:計算匹配的行數,而不是顯示行內容。
- -l:只列出包含匹配文本的文件名,而不顯示匹配的行。
- -n:顯示匹配的行號。
- -r 或 -R:遞歸搜索子目錄中的文件。
- -E:使用擴展的正則表達式。
- -F:將模式作為固定字元串處理,而不是正則表達式。
- -o:只輸出匹配的部分,而不是整行。
- -A 數字:顯示匹配行以及之後的幾行。
- -B 數字:顯示匹配行以及之前的幾行。
- -C 數字:顯示匹配行以及上下文的幾行。
3、示例
1)基本語法
grep pattern file.txt
2)忽略大小寫
grep -i pattern file.txt
3)顯示行號
grep -n pattern file.txt
4)遞歸搜索所有子目錄
grep -rnw '/path/to/directory' -e 'pattern'
5)只顯示文件名
grep -l pattern *.txt
6)只顯示匹配的行數
grep -c pattern file.txt
7)匹配整個單詞
grep -w pattern file.txt
8)使用正則表達式
grep -E '\bword\b' file.txt
9)顯示上下文的幾行
grep -C 2 pattern file.txt
10)搜索文件中的所有“error”字元串
grep "error" /var/log/syslog
11)搜索當前目錄及子目錄下所有文件中包含“function”的行,並顯示行號
grep -rn "function" .
12)計算文件中包含“warning”的行數
grep -c "warning" file.txt
13)反向選擇,顯示不包含“debug”的所有行
grep -v "debug" file.txt
14)在多個文件中查找
grep "match_pattern" file_1 file_2 file_3 ...
15)標記匹配顏色 --color=auto 選項
grep "match_pattern" file_name --color=auto
16)使用正則表達式 -E 選項
grep -E "[1-9]+" 或 egrep "[1-9]+"
17)只輸出文件中匹配到的部分 -o 選項
[root@localhost ~]# echo this is a test line. | grep -o -E "[a-z]+\." line. [root@localhost ~]# echo this is a test line. | egrep -o "[a-z]+\." line.
18)統計文件或者文本中包含匹配字元串的行數 -c 選項
grep -c "text" file_name
19)輸出包含匹配字元串的行數 -n 選項
grep "text" -n file_name 或 cat file_name | grep "text" -n #多個文件 grep "text" -n file_1 file_2
20)搜索多個文件並查找匹配文本在哪些文件中
grep -l "text" file1 file2 file3...
4、grep遞歸搜索文件
1)在多級目錄中對文本進行遞歸搜索
grep "text" . -r -n # .表示當前目錄
2)忽略匹配樣式中的字元大小寫
[root@localhost ~]# echo "hello world" | grep -i "HELLO" hello world
3)選項 -e 制動多個匹配樣式
[root@localhost ~]# echo this is a text line | grep -e "is" -e "line" -o is is line #也可以使用-f選項來匹配多個樣式,在樣式文件中逐行寫出需要匹配的字元。 [root@localhost myfolder]# cat patfile aaa bbb [root@localhost myfolder]# echo aaa bbb ccc ddd eee | grep -f patfile -o aaa bbb
4)在grep搜索結果中包括或者排除指定文件
#只在目錄中所有的.php和.html文件中遞歸搜索字元"main()" grep "main()" . -r --include *.{php,html} #在搜索結果中排除所有README文件 grep "main()" . -r --exclude "README" #在搜索結果中排除filelist文件列表裡的文件 grep "main()" . -r --exclude-from filelist
5)grep靜默輸出
grep -q "test" filename #不會輸出任何信息,如果命令運行成功返回0,失敗則返回非0值。一般用於條件測試。
6)列印出匹配文本之前或者之後的行
#顯示匹配某個結果之後的3行,使用 -A 選項: [root@localhost myfolder]# seq 10 | grep "5" -A 3 5 6 7 8 #顯示匹配某個結果之前的3行,使用 -B 選項: [root@localhost myfolder]# seq 10 | grep "5" -B 3 2 3 4 5 #顯示匹配某個結果的前三行和後三行,使用 -C 選項: [root@localhost myfolder]# seq 10 | grep "5" -C 3 2 3 4 5 6 7 8 #如果匹配結果有多個,會用“--”作為各匹配結果之間的分隔符: [root@localhost myfolder]# echo -e "a\nb\nc\na\nb\nc" | grep a -A 1 a b -- a b
三、sed命令
sed 是一種線上編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接著處理下一行,這樣不斷重覆,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程式等。
1、基本語法
sed [選項]... '{命令}' [輸入文件]...
- 選項:控制sed的行為,如-i直接修改文件內容,-e允許多個編輯命令等。
- 命令:用單引號括起來,指定要對文本執行的操作。
- 輸入文件:指定sed要處理的文件。如果未指定文件,sed將從標準輸入讀取數據。
2、常用選項
- -e:添加一個編輯命令。
- -f:從文件中讀取編輯命令。
- -i:直接修改文件內容。
- -n:抑制預設輸出,只輸出被明確指定的行。
- -r:啟用擴展正則表達式支持。
- -u:以原子方式更新文件(與 -i 一起使用)。
3、命令格式
sed 命令的基本格式是:
[address][,address] command
- address:可以是行號或正則表達式,用於指定命令作用的範圍。
- command:要執行的操作。
4、常用命令
- p:列印匹配的行。
- d:刪除匹配的行。
- s:替換文本。
- i:在指定行之前插入文本。
- a:在指定行之後追加文本。
- c:替換匹配的行。
5、示例
1)列印文件的前幾行
sed -n '1,5p' filename
-n選項和p命令一起使用,僅列印被p命令指定的行(這裡是前1~5行)。
2)刪除文件中的空行
sed '/^$/d' filename
使用正則表達式/^$/匹配空行,d命令刪除這些行。
3)替換文本
sed 's/old/new/g' filename
將文件中的"old"替換為"new"。g標誌表示全局替換(即每行中的所有匹配項)。
4)直接修改文件(危險動作,註意確認)
sed -i 's/old/new/g' filename
-i選項允許sed直接修改文件內容,而不是輸出到標準輸出。
5)在特定行之前或之後插入文本
sed '3i\New line' filename # 在第3行之前插入"New line" sed '3a\New line' filename # 在第3行之後追加"New line"
6)替換整行
sed '3c\This is a new line' filename
將第3行替換為"This is a new line"。
7)替換字元串並保存結果
sed -i 's/pattern/replacement/g' file.txt
這將直接修改 file.txt 文件中的內容。
8)讀取多個文件並應用相同的編輯
sed 's/pattern/replacement/g' file1.txt file2.txt
9)使用多個編輯命令
sed -e 's/pattern1/replacement1/g' -e 's/pattern2/replacement2/g' file.txt
10)使用行號指定編輯範圍
sed '1,10 s/pattern/replacement/g' file.txt
11)以行為單位的新增/刪除
將 ./file 的內容列出並且列印行號,同時刪除2~5行內容:
[root@localhost myfolder]# nl ./file | sed '2,5d' 1 11 6 66 7 77 8 88 9 99 ......
因為2~5行內容被刪除了,所以就不顯示2~5行的內容了。
只要刪除第 2 行:
[root@localhost myfolder]# nl ./file | sed '2d' 1 11 3 33 4 44 5 55 6 66 ......
要刪除第 10 到最後一行:
[root@localhost myfolder]# nl ./file | sed '10,$d' 1 11 2 22 3 33 4 44 5 55 6 66 7 77 8 88 9 99
在第2行後面加上[drink tea]字樣:
[root@localhost myfolder]# nl ./file | sed '2a drink tea' 1 11 2 22 drink tea 3 33 4 44 5 55 6 66 7 77 8 88 9 99 ......
在第2行前面加上[drink tea]字樣:
[root@localhost myfolder]# nl ./file | sed '2i drink tea' 1 11 drink tea 2 22 3 33 4 44 5 55 6 66 7 77 ......
如果要增加兩行以上,例如:[Drink tea or …..]與[drink beer?]:
[root@localhost myfolder]# nl ./file | sed '2a Drink tea or ......\ > drink beer?' 1 11 2 22 Drink tea or ...... drink beer? 3 33 4 44 5 55 ...省略...
每一行之間都必須要以反斜杠“\”來進行新行的添加。
12)以行為單位的替換與顯示
將第2~5行的內容替換為[No 2~5]:
[root@localhost myfolder]# nl ./file | sed '2,5c No 2~5' 1 11 No 2~5 6 66 7 77 8 88 ......
通過這個方法我們就能夠將數據整行取代了!
僅列出 ./file 文件內的第 5~7 行內容:
[root@localhost myfolder]# nl ./file | sed -n '5,7p' 5 55 6 66 7 77
13)數據的搜尋並顯示
搜索 ./file 有aa關鍵字的行,並且只輸出匹配的行:
[root@localhost myfolder]# nl ./file | sed -n '/aa/p' 17 aa 32 dsaaaaaaaaaassdasdassdadadssdasdasd3213213213 37 Gaaa 59 aaaaa
其中使用-n表示只列印匹配的行。
14)數據的搜尋並刪除
刪除 ./file 所有包含“22”的行,其他行輸出:
[root@localhost myfolder]# nl ./file | sed '/22/d' 1 11 3 33 4 44 5 55 6 66 ......
15)數據的搜尋並執行命令
搜索 ./file 文件找到root對應的行,執行後面花括弧中的一組命令,每個命令之間用分號分隔,這裡把 test 替換為 testNew,再輸出這行:
[root@localhost myfolder]# nl ./file | sed -n '/root/{s/test/testNew/;p}' 32 testNew admin root
如果只替換 ./file 的第一個 test 關鍵字為 testNew ,就退出:
[root@localhost myfolder]# nl ./file | sed -n '/test/{s/test/testNew/;p;q}' 32 testNew admin root
最後的q表示退出。
16)數據的搜尋並替換
除了整行的處理模式之外,sed 還可以用行為單位進行部分數據的搜尋並取代。基本上 sed 的搜尋、替代與 vi 類似:
sed 's/要被取代的字串/新的字串/g'
四、awk命令
awk是行處理器:相比較屏幕處理的優點,在處理大文件時不會出現記憶體溢出或是處理緩慢的問題,通常用來格式化文本信息。
awk處理過程:依次對每一行進行處理,然後輸出。
1、基本語法
awk [options] 'pattern {action}' [filename]
- options:命令行選項,用於控制awk的工作方式。這些選項包括設置欄位分隔符、定義變數等。
- pattern:模式匹配,用於指定哪些行或記錄需要被處理。模式可以是正則表達式、條件表達式或布爾表達式。如果省略pattern,則對所有行執行action。
- action:當模式匹配成功時,需要執行的命令或語句。這些命令或語句可以是內置的awk命令,也可以是自定義的代碼塊。
- filename:指定要處理的文件名。如果省略,則預設從標準輸入讀取。
2、常用選項
- -F fs 或 --field-separator=fs:設置欄位分隔符,預設為空格。
- -v var=val 或 --assign=var=val:定義變數及其初始值。
- -f script-file 或 --file=script-file:從文件中讀取awk腳本。
- -i inplace 或 --inplace:直接在原文件上修改(註意:這個選項在GNU awk中可能不被支持,需要使用其他工具如sed實現)。
- -n 或 --non-decimal-data:允許非十進位數被識別。
- -W interactive 或 --interactive:以交互模式運行。
3、腳本語法
awk 腳本通常由模式(pattern)和動作(action)組成。基本形式為:
pattern { action }
- pattern:一個表達式,如果為真,則執行 action。
- action:一組要執行的命令。
如果省略 pattern,則預設為 true,意味著 action 將應用於每一行。
4、內置變數
awk 提供了一些內置變數來簡化腳本編寫:
- ARGC:命令行參數的數量。
- ARGV:命令行參數的數組。
- ENVIRON:環境變數的數組。
- FILENAME:當前文件名。
- FNR:當前文件中的記錄編號。
- FS:欄位分隔符。
- NF:當前記錄中的欄位數量。
- NR:所有處理過的記錄總數。
- OFS:輸出欄位分隔符。
- ORS:輸出記錄分隔符。
- RS:輸入記錄分隔符。
5、函數
awk 提供了多種內置函數來處理文本和數值數據:
- print:輸出數據。
- printf:格式化輸出數據。
- getline:從文件中讀取一行。
- split:分割字元串到數組。
- gsub:全局替換。
- match:正則表達式匹配。
- rand 和 srand:生成隨機數。
- sqrt, exp, log, sin, cos, atan2:數學函數。
- tolower 和 toupper:轉換字元串為小寫或大寫。
- length:返回字元串長度。
- index:返回子字元串的位置。
- substr:獲取子字元串。
- mktime:轉換日期字元串為時間戳。
6、awk命令形式
awk [-F|-f|-v] 'BEGIN{} /pattern/ {command1;command2} END{}' [filename]
- [-F|-f|-v] 大參數,-F指定分隔符,-f調用腳本,-v定義變數 var=value
- ' ' 引用代碼塊
- BEGIN 初始化代碼塊,在對每一行進行處理之前,初始化代碼,主要是引用全局變數,設置FS分隔符
- /pattern/ 匹配代碼塊,可以是字元串或正則表達式
- {} 命令代碼塊,包含一條或多條命令
- ; 多條命令使用分號分隔
- END 結尾代碼塊,在對每一行進行處理之後再執行的代碼塊,主要是進行最終計算或輸出結尾摘要信息
- [filename] 需要處理的文件
7、特殊要點
$0 | 表示整個當前行 |
$1 | 每行第一個欄位 |
$n | 當前記錄的第n個欄位,欄位間由FS分隔 |
NF | 欄位數量變數 |
NR | 每行的記錄號,多文件記錄遞增 |
FNR | 與NR類似,不過多文件記錄不遞增,每個文件都從1開始 |
\t | 製表符 |
\n | 換行符 |
FS | BEGIN時定義分隔符(預設是任何空格) |
RS | 輸入的記錄分隔符, 預設為換行符(即文本是按一行一行輸入) |
~ | 匹配,與==相比不是精確比較 |
!~ | 不匹配,不精確比較 |
== | 等於,必須全部相等,精確比較 |
!= | 不等於,精確比較 |
&& | 邏輯與 |
|| | 邏輯或 |
OFS | 輸出欄位分隔符, 預設也是空格,可以改為製表符等 |
ORS | 輸出的記錄分隔符,預設為換行符,即處理結果也是一行一行輸出到屏幕 |
-F'[:#/]' | 定義三個分隔符 |
8、示例
1) 列印所有行
awk '{print}' file.txt
2)列印特定列
awk '{print $1}' file.txt # 列印第一列
3)計算總和
awk '{sum += $1} END {print sum}' numbers.txt
4)過濾特定模式
awk '/pattern/ {print}' file.txt
5)使用多個模式
awk '/pattern1/ || /pattern2/ {print}' file.txt
6)自定義分隔符
awk -F: '{print $1}' /etc/passwd # 使用冒號作為分隔符,列印/etc/passwd文件的第一列(用戶名)
9、註意事項
- awk預設按行處理文本,並使用空格作為欄位分隔符。
- awk支持變數定義、流程式控制制(如if、else、for、while)、數學函數和字元串函數等高級功能。
- awk還提供了BEGIN和END兩個特殊的模式塊,BEGIN塊在讀取任何輸入行之前執行,END塊在讀取完所有輸入行之後執行。
- awk中的$0代表整行文本,$1、$2、$3...代表第一個、第二個、第三個欄位等。
- awk還包含一些內置變數,如NR(當前記錄號,即行號)、NF(當前記錄的欄位數,即每行的列數)等。
這些只是 awk 基礎使用的冰山一角。awk 的功能非常強大,可以編寫複雜的腳本來處理各種各樣的任務。
此文由博主精心撰寫轉載請保留此原文鏈接:https://www.cnblogs.com/xyh9039/p/18337347
版權聲明:如有雷同純屬巧合,如有侵權請及時聯繫本人修改,謝謝!!!