1.概述
Linux系統下,grep、sed和awk三個命令是最常用的、非常強大的文本處理工具,可以用于搜索、替換、過濾、排序等多種操作,掌握這三種工具的用法,可以大大提高我們在Linux下處理文本的效率。
2.grep命令
grep是一種非常常見的文本搜索工具,它可以搜索指定字符串在一個或多個文件中出現的行,并將結果輸出到標準輸出。語法格式如下:
grep?[OPTIONS] PATTERN [FILE…] |
其中,OPTIONS表示選項,PATTERN表示要搜索的模式,FILE表示要搜索的文件名。
grep命令的常見選項包括:
- ?-i:忽略大小寫
- ?-w:完全匹配
- ?-v:顯示不匹配的行
- ?-n:顯示行號
- ?-c:顯示匹配行的數量
- ?-r:遞歸搜索子目錄
- ?-e:搜索多個字符串
詳細選項參數及其含義可以通過“grep --help”獲取,具體如下:
[test@localhost ~]$ grep --help 用法:?grep [選項]... 模式 [文件]... 在每個<文件>中查找給定<模式>。 例如:grep -i 'hello world' menu.h main.c <模式>可以包括多個模式字符串,使用換行符進行分隔。 模式選擇與解釋: ??-E, --extended-regexp ????<模式> 是擴展正則表達式 ??-F, --fixed-strings ???????<模式> 是字符串 ??-G, --basic-regexp ???????<模式> 是基本正則表達式 ??-P, --perl-regexp ?????????<模式> 是 Perl 正則表達式 ??-e, --regexp=<模式> ??????用指定的<模式>字符串來進行匹配操作 ??-f, --file=<文件> ?????????從給定<文件>中取得<模式> ??-i, --ignore-case ??????????在模式和數據中忽略大小寫 ??????--no-ignore-case ??????不要忽略大小寫(默認) ??-w, --word-regexp ?????????強制<模式>僅完全匹配字詞 ??-x, --line-regexp ???????????強制<模式>僅完全匹配整行 ??-z, --null-data ?????????????數據行以一個 0 字節結束,而非換行符 雜項: ??-s, --no-messages ????????不顯示錯誤信息 ??-v, --invert-match ????????選中不匹配的行 ??-V, --version ????????????顯示版本信息并退出 ??????--help ???????????????顯示此幫助并退出 輸出控制: ??-m, --max-count=<次數> ???得到給定<次數>次匹配后停止 ??-b, --byte-offset ?????????輸出的同時打印字節偏移 ??-n, --line-number ????????輸出的同時打印行號 ??????--line-buffered ??????每行輸出后刷新輸出緩沖區 ??-H, --with-filename ??????為輸出行打印文件名 ??-h, --no-filename ????????輸出時不顯示文件名前綴 ??????--label=<標簽> ???????將給定<標簽>作為標準輸入文件名前綴 ??-o, --only-matching ??????只顯示行中非空匹配部分 ??-q, --quiet, --silent ???????不顯示所有常規輸出 ??????--binary-files=TYPE ???設定二進制文件的 TYPE(類型); ????????????????????????????TYPE 可以是 'binary'、'text' 或 'without-match' ??-a, --text ?????????????????等同于 --binary-files=text ??-I ???????????????????????等同于 --binary-files=without-match ??-d, --directories=ACTION ???讀取目錄的方式; ????????????????????????????ACTION 可以是`read', `recurse',或`skip' ??-D, --devices=ACTION ?????讀取設備、先入先出隊列、套接字的方式; ????????????????????????????ACTION 可以是`read'或`skip' ??-r, --recursive ??????????????等同于--directories=recurse ??-R, --dereference-recursive ??????同上,但遍歷所有符號鏈接 ??????--include=GLOB ????????search only files that match GLOB (a file pattern) ??????--exclude=GLOB ???????skip files that match GLOB ??????--exclude-from=FILE ????skip files that match any file pattern from FILE ??????--exclude-dir=GLOB ?????skip directories that match GLOB ??-L, --files-without-match ????只打印沒有匹配上的<文件>的名稱 ??-l, --files-with-matches ?????只打印有匹配的<文件>的名稱 ??-c, --count ???????????????只打印每個<文件>中的匹配行數目 ??-T, --initial-tab ????????????行首制表符對齊(如有必要) ??-Z, --null ?????????????????在<文件>名最后打印空字符 文件控制: ??-B, --before-context=NUM ????打印文本及其前面NUM 行 ??-A, --after-context=NUM ?????打印文本及其后面NUM 行 ??-C, --context=NUM ?????????打印NUM 行輸出文本 ??-NUM ?????????????????????等同于 --context=NUM ??????--color[=WHEN], ??????--colour[=WHEN] ??????使用標記高亮匹配字串; ????????????????????????????WHEN 可以是“always”、“never”或“auto” ??-U, --binary ???????????????不要清除行尾的 CR 字符(MSDOS/Windows) 若給定<文件>為“-”,則從讀取標準輸入。 ?若無<文件>參數,則除非處于 遞歸工作模式視為從“.”讀取之外,一律視為從“-”讀取。如果提供了少于 兩個<文件>參數,則默認啟用 -h 選項。如果有任意行(或者指定了 -L 選項 并有任意文件)被匹配,則退出狀態為?0,否則為 1;如果有錯誤產生,且未指 定?-q 參數,則退出狀態為 2。 |
3.sed命令
sed是一種流編輯器,它可以執行各種文本操作,如替換、刪除、插入等。語法格式如下:
sed [OPTIONS] COMMAND [FILE…] |
其中,OPTIONS表示選項,COMMAND表示要執行的sed命令,FILE表示要處理的文件名。
sed命令的常見動作包括:
- ?a:新增,a的后面可以接字符串,而這些字符串會在新的一行出現(當前行的后一行)
- ?i:插入指定字符串,i的后面可以接字符串,而這些字符串會在新的一行出現(當前行的前一行)
- ?s:替換指定模式,通常會搭配正則表達式
- ?c:替換指定行
- ?d:刪除指定行
- ?y:字符串轉換
- ?p:打印匹配的行,通常會與參數sed -n一起使用
詳細選項參數及其含義可以通過“sed --help”獲取,具體如下:
[test@localhost ~]$ sed --help 用法: sed [選項]... {腳本(如果沒有其他腳本)} [輸入文件]... ??-n, --quiet, --silent ?????????????????取消自動打印模式空間 ??????--debug ?????????????????對程序運行進行標注 ??-e 腳本, --expression=腳本 ?????????????????添加“腳本”到程序的運行列表 ??-f 腳本文件, --file=腳本文件 ?????????????????添加“腳本文件”到程序的運行列表 ??--follow-symlinks ?????????????????直接修改文件時跟隨軟鏈接 ??-i[擴展名], --in-place[=擴展名] ?????????????????直接修改文件(如果指定擴展名則備份文件) ??-l N, --line-length=N ?????????????????指定“l”命令的換行期望長度 ??--posix ?????????????????關閉所有 GNU 擴展 ??-E, -r, --regexp-extended ?????????????????在腳本中使用擴展正則表達式 ?????????????????(為保證可移植性使用 POSIX -E)。 ??-s, --separate ?????????????????將輸入文件視為各個獨立的文件而不是單個 ?????????????????長的連續輸入流。 ??????--sandbox ?????????????????在沙盒模式中進行操作(禁用 e/r/w 命令)。 ??-u, --unbuffered ?????????????????從輸入文件讀取最少的數據,更頻繁的刷新輸出 ??-z, --null-data ?????????????????使用 NUL 字符分隔各行 ??????--help ????打印幫助并退出 ??????--version ?輸出版本信息并退出 如果沒有?-e, --expression, -f 或 --file 選項,那么第一個非選項參數被視為 sed腳本。其他非選項參數被視為輸入文件,如果沒有輸入文件,那么程序將從標準 輸入讀取數據。 |
4.awk命令
awk是一種文本處理工具,它可以用于格式化、過濾與計算等操作。語法格式如下:
awk [OPTIONS] 'PATTERN {ACTION}?' [FILE…] |
其中,OPTIONS表示選項,PATTERN表示要匹配的模式,ACTION 表示要執行的操作,FILE表示要處理的文件名。
awk命令的常見選項包括:
- ?print:打印指定內容
- ?if:條件判斷
- ?for:循環結構
- ?sum:計算指定
詳細選項參數及其含義可以通過“awk --help”獲取,具體如下:
[test@localhost ~]$ awk --help Usage: awk [POSIX or GNU style options] -f progfile [--] file ... Usage: awk [POSIX or GNU style options] [--] 'program' file ... POSIX options: ?????????GNU long options: (standard) ????????-f progfile ????????????--file=progfile ????????-F fs ??????????????????--field-separator=fs ????????-v var=val ?????????????--assign=var=val Short options: ?????????GNU long options: (extensions) ????????-b ?????????????????????--characters-as-bytes ????????-c ?????????????????????--traditional ????????-C ?????????????????????--copyright ????????-d[file] ???????????????--dump-variables[=file] ????????-D[file] ???????????????--debug[=file] ????????-e 'program-text' ??????--source='program-text' ????????-E file ????????????????--exec=file ????????-g ?????????????????????--gen-pot ????????-h ?????????????????????--help ????????-i includefile ?????????--include=includefile ????????-l library ?????????????--load=library ????????-L[fatal|invalid|no-ext] ???????--lint[=fatal|invalid|no-ext] ????????-M ?????????????????????--bignum ????????-N ?????????????????????--use-lc-numeric ????????-n ?????????????????????--non-decimal-data ????????-o[file] ???????????????--pretty-print[=file] ????????-O ?????????????????????--optimize ????????-p[file] ???????????????--profile[=file] ????????-P ?????????????????????--posix ????????-r ?????????????????????--re-interval ????????-s ?????????????????????--no-optimize ????????-S ?????????????????????--sandbox ????????-t ?????????????????????--lint-old ????????-V ?????????????????????--version To report bugs, see node `Bugs' in `gawk.info' which is section `Reporting Problems and Bugs' in the printed version. ?This same information may be found at https://www.gnu.org/software/gawk/manual/html_node/Bugs.html. PLEASE do NOT try to report bugs by posting in comp.lang.awk, or by using a web forum such as Stack Overflow. gawk is a pattern scanning and processing language. By default it reads standard input and writes standard output. Examples: ????????gawk '{ sum += $1 }; END { print sum }' file ????????gawk -F: '{ print $1 }' /etc/passwd |
5.使用實例
(1)?grep使用實例
--在文件中搜索指定字符串 grep?-i?"關鍵字" 文件名??????--模糊匹配(不區分大小寫) grep?-w?"關鍵字" 文件名?????--完全匹配 --在文件中搜索多個字符串 grep -e "關鍵字1" -e "關鍵字2" 文件名 --在文件中搜索并顯示匹配的行號 grep?-n?"關鍵字" 文件名 --在文件中搜索并顯示不匹配的行 grep -v "關鍵字" 文件名 --在目錄中遞歸搜索指定字符串 grep?-r?"關鍵字" directory/ --查看文件中搜索的關鍵字的后n行 cat 文件 | grep -An -i "關鍵字" --查看文件中搜索的關鍵字的前n行 cat 文件 | grep -Bn -i "關鍵字" --查看文件中搜索的關鍵字的前后n行 cat 文件 | grep -C20 -i "關鍵字" |
(2)?sed使用實例
/*?選擇文本p */ --顯示文件的1-3行,不使用-n sed 1,3p 文件名 --只顯示文件的1-3行,使用-n sed -n 1,3p 文件名 --顯示包含關鍵字的行 sed -n '/關鍵字/p' 文件名 /*?替換文本s */ 語法格式:[位置參數1] [,位置參數2]?s/匹配字符/替換字符/[標志] 標志說明: g:全局匹配,會替換文本行中所有符合規則的字符串 十進制數字n:替換第n個符合規則的字符串 p:替換第一個,并輸出到標準輸出 w:替換第一個,并輸出到磁盤文件中 空:不加標志,則替換第一個 --把文件的a全部替換成A? sed 's/a/A/g' 文件名 > 新文件名 --對指定行進行替換 sed '1,3 s/a/A/g' 文件名 > 新文件名 /*?刪除文本d */ --刪除文件的第一行 sed '1d' 文件名 --刪除文件的最后一行 sed '$d' 文件名 --刪除空白行 sed '/^$/d' 文件名 /*?追加文本a */ --在文件中root開頭的行的后面插入一行test sed '/^root/a test' 文件名 /*?插入文本i */ --在文件中root開頭的行的前面插入一行test sed '/^root/i test' 文件名 |
(3)?awk使用實例
--打印文件中的所有行 awk '{print}' filename --打印文件中第二列的內容 awk '{print $2}' filename --計算文件中所有數字的總和 awk '{sum += $1} END {print sum}' filename --打印文件中包含指定字符串的行 awk '/關鍵字/?{print}' filename --在文件中指定列后面添加指定字符串 awk '{$3 = $3 "關鍵字"} {print}' filename |