linux下grep、awk和sed工具用法概覽

linux下grep、awk和sed工具用法概覽

在linux下,grep、awk和sed是很是強大的文本處理工具,其中grep命令主要用做文本搜索,而awk和sed命令側重於文本的編輯等操做,另外awk自己還能夠是編程語言,提供了編程語言中相關的概念。從功能上,總的來講,awk >> sed >> grephtml

grep命令

grep命令主要用於按行文本搜索,搜索的條件以正則表達式給出。grep在linux下的幫助說明以下: grep幫助說明
上面給出的說明較多,這裏提取一些較爲重要且經常使用的選項加以說明。linux

  1. -E 使用擴展正則表達式規則
  2. -F 搜索固定字符串,這裏表示的是模式中的內容不使用正則表達式規則去處理
  3. -G 使用基礎正則表達式,這裏指的是由posix規範定義的正則表達式規則集,相比於咱們平常使用較多的pcre正則表達式少了部分規則
  4. -P 使用pcre正則表達式規則集
  5. -r 遞歸搜索整個目錄

具體用法可參考下面的代碼:正則表達式

# 搜索ubuntu下qt5的相關庫
apt search libqt5

# 搜索ubuntu下qt5相關庫,並過濾出全部dev開發包
apt search libqt5 | grep -E "^libqt5.+dev"

# posix基礎正則集,不支持定位符,無結果
apt search libqt5 | grep -G "^libqt5.+dev"

# 能夠得到qt5庫的dev開發包
apt search libqt5 | grep -P "^libqt5.+dev"

# 無任何結果
apt search libqt5 | grep -F "^libqt5.+dev"

sed命令

sed是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能不一樣凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無改變,除非使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。sed命令的linux下幫助說明以下圖:express

sed幫助說明

較爲重要的選項有:編程

  1. -e <script>或--expression=<script>,以選項中的指定的script來處理輸入的文本文件
  2. -f <script文件>或--file=<script文件>,以選項中指定的script文件來處理輸入的文本文件
  3. -n或--quiet或--silent,僅顯示script處理後的結果

從sed的幫助說明中,能夠發現sed的輸入選項較少,換而之,sed的輸入腳本則很重要。sed腳本中經常使用操做以下表:ubuntu

操做符 說明
a\ 在當前行下面插入文本。
i\ 在當前行上面插入文本。
c\ 把選定的行改成新的文本。
d 刪除,刪除選擇的行。
D 刪除模板塊的第一行。
s 替換指定字符
h 拷貝模板塊的內容到內存中的緩衝區。
H 追加模板塊的內容到內存中的緩衝區。
g 得到內存緩衝區的內容,並替代當前模板塊中的文本。
G 得到內存緩衝區的內容,並追加到當前模板塊文本的後面。
l 列表不能打印字符的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊後面並在兩者間嵌入一個新行,改變當前行號碼。
p 打印模板塊的行。
P(大寫) 打印模板塊的第一行。
q 退出Sed。
b lable 分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾。
r file 從file中讀行。
t label if分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
T label 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
w file 寫並追加模板塊到file末尾。
W file 寫並追加模板塊的第一行到file末尾。
! 表示後面的命令對全部沒有被選定的行發生做用。
= 打印當前行號碼。
# 把註釋擴展到下一個換行符之前

sed命令的使用實例:數組

# 在當前行下面插入Jackie
echo "Hello World" | sed 'a\Jackie'
# 結果爲:
# Hello World
# Jackie

# 在當前行上面插入Jackie
echo "Hello World" | sed 'i\Jackie'
# 結果爲:
# Jackie
# Hello World

# 將選定行修改成Jackie
echo "Hello World" | sed 'c\Jackie'
# 結果爲:
# Jackie

# 刪除以Hello字符串開頭的行
echo -e "Hello\nWorld" | sed '/^Hello/d'
# 結果爲:
# World

# 將Hello替換爲Hi
echo -e "Hello World" | sed 's/Hello/Hi/'
# 結果爲:
# Hi World

須要注意的是,上面代碼僅僅列舉出了sed命令較爲簡單的用法,更爲複雜的用法能夠參考sed官方幫助手冊bash

awk命令

awk是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。awk相對於grep和sed更爲複雜,我的以爲除非是特殊的場景,例若有着大量複雜的文本處理需求,不然不建議專門學習其背後的語言。使用時,語法和概念能夠參考官方文檔。awk腳本基本結構以下:編程語言

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file編輯器

一個awk腳本一般由:BEGIN語句塊、可以使用模式匹配的通用語句塊、END語句塊3部分組成,這三個部分是可選的。任意一個部分均可以不出如今腳本中,腳本一般是被單引號或雙引號中,例如:

awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename

awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

awk的基本工做原理爲:

  1. 第一步:執行BEGIN{ commands }語句塊中的語句
  2. 第二步:從文件或標準輸入(stdin)讀取一行,而後執行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最後一行重複這個過程,直到文件所有被讀取完畢
  3. 第三步:當讀至輸入流末尾時,執行END{ commands }語句塊

BEGIN語句塊在awk開始從輸入流中讀取行以前被執行,這是一個可選的語句塊,好比變量初始化、打印輸出表格的表頭等語句一般能夠寫在BEGIN語句塊中。END語句塊在awk從輸入流中讀取完全部的行以後即被執行,好比打印全部行的分析結果這類信息彙總都是在END語句塊中完成,它也是一個可選語句塊。pattern語句塊中的通用命令是最重要的部分,它也是可選的。若是沒有提供pattern語句塊,則默認執行{ print },即打印每個讀取到的行,awk讀取的每一行都會執行該語句塊。

總結

對於grep、sed和awk工具,因爲都圍繞在正則表達式而展開,於是想熟練使用這三個工具進行文本處理,首先必需要深刻了解正則表達式,作到經常使用功能爛熟於心。在瞭解了正則表達式以後,grep和sed命令只要瞭解相關的選項和操做的含義並會用便可,而對於更爲複雜並強大的awk命令則應視狀況而定,若是真有相關場景,在深刻學習和使用便可。

相關文章
相關標籤/搜索