揭秘大廠高效秘籍:掌握Linux三劍客

Linux三劍客是Linux系統中最重要的三個命令,它們以其強大的功能和廣泛的應用場景而聞名。這三個工具的組合使用幾乎可以完美應對Shell中的資料分析場景,因此被統稱為Linux三劍客。

1、grep

grep是一個強大的文字搜尋工具,用於在檔案內容中查詢指定的字串,並將匹配到的行輸出到標準輸出。grep命令支援多種選項和模式匹配,使得在檔案中搜索特定內容變得非常靈活和高效。

文字搜尋命令;
  • 命令格式為:

grep

"搜尋的字串"

檔名

1)基礎

引數:

-c:統計出現的次數

-i:不區分大小寫

-n:輸出行號

2)例項

統計出現的次數

grep -c "xx" text.log

2、sed

sed是一個流編輯器,主要用於對輸入流(或檔案)進行基本的文字轉換。它可以用來查詢、新增、刪除和修改替換文字中的資料。sed命令的強大之處在於它可以對文字進行非互動式的編輯,從而提高了處理大量文字的效率。

1)基本概念

sed是一種流編輯器,它是文字處理工具,支援正則表示式,透過一行一行的遍歷,執行相應的命令,來處理、編輯文字檔案。

(1)語法

sed [選項] ‘command’ 檔名稱
選項部分,常見選項包括-n,-e,-i,-f,-r選項。

command部分包括:[地址1,地址2] [函式] [引數(標記)]
(2)命令格式為:

sed [-nefri]

'命令'

文字

cat

文字 | sed [-nefr]

'命令'
echo'.....'

|sed [-nefr]

'命令'

2)選項(nefri)

(1)選項-n
sed預設會把模式空間處理完畢後的內容輸出到標準輸出,也就是輸出到螢幕上,加上-n選項後被設定為安靜模式,也就是不會輸出預設列印資訊,除非子命令中特別指定列印選項,則只會把匹配修改的行進行列印。

(2)選項-e
如果需要用sed對文字內容進行多種操作,則需要執行多條子命令來進行操作。
(3)選項-i
sed預設會把輸入行讀取到模式空間,簡單理解就是一個記憶體緩衝區,sed子命令處理的內容是模式空間中的內容,而非直接處理檔案內容。因此在sed修改模式空間內容之後,並非直接寫入修改輸入檔案,而是列印輸出到標準輸出。如果需要修改輸入檔案,那麼就可以指定-i選項。
(4)選項-f
還記得 -e 選項可以來執行多個子命令操作,用分號分隔多個命令操作也是可以的,如果命令操作比較多的時候就會比較麻煩,這時候把多個子命令操作寫入指令碼檔案,然後使用 -f 選項來指定該指令碼。
(5)選項-r

sed命令的匹配模式支援正則表示式的,預設只能支援基本正則表示式,如果需要支援擴充套件正則表示式,那麼需要新增-r選項。

3)命令(acdipynNs)

a新增,c取代,d刪除,i插入,p列印,y將字元轉成另一個字元等

[root@localhost sed]

# cat message

1a

2b

3c

4d

5e

6f

abcdABCD

(1)a
子命令a表示在指定行下邊插入指定行的內容。
#將message檔案中每一行下邊都插入新增一行內容是A

sed

'a A'

message

#將message檔案中1-2行的下邊插入新增一行內容是A

sed

'1,2a A'

message

#將message檔案中1-2行的下邊分別新增3行,3行內容分別是A、B、C,這裡使用了\n,插入多行內容都可以按照這種方式來實現。

sed

'1,2a A\nB\nC'

message

(2)i
子命令i和a使用上基本上一樣,只不過是在指定行上邊插入指定行的內容。
#將message檔案中每一行上邊都插入新增一行內容是A

sed

'i A'

message

#將message檔案中1-2行的上邊插入新增一行內容是A

sed

'1,2i A'

message

#將message檔案中1-2行的上邊分別新增3行,3行內容分別是A、B、C,這裡使用了\n,插入多行內容都可以按照這種方式來實現

sed

'1,2i A\nB\nC'

message

(3)c
子命令c是表示把指定的行內容替換為自己需要的行內容。
#將message檔案中所有的行內容都分別替換為A行內容

sed

'c A'

message

#將message檔案中1-2行的內容替換為A,注意這裡說的是將1-2行所有的內容只替換為一個A內容,也就是1-2行內容變成了一行,定址如果連續就是這種情況

sed

'1,2c A'

message

#將message中1-2行內容分別替換為了A,需要在替換內容上手動加換行\n,這樣當然也可以將一行內容替換為多行內容

sed

'1,2c A\nA'

message

(4)d
子命令d表示刪除指定的行內容,比較簡單,更容易理解。
#將message所有行全部刪除,因為沒有加定址表示式,所以平時如果需要刪除指定行內容,需要在子命令前加定址表示式

sed

'd'

message

#將message檔案中1-3行內容刪除

sed

'1,2d'

message

(5)y
子命令y表示字元替換,可以替換多個字元,只能替換字元不能替換字串,且不支援正則表示式,
#把message中所有a字元替換為A符號,所有b字元替換為B符號

sed

'y/aB/Ab/'

message

(6)=
子命令=,可以將行號打印出來。
#將指定行的上邊顯示行號

sed

'1,2='

message

(7)r
子命令r,類似於a,也是將內容追加到指定行的後邊,只不過r是將指定檔案內容讀取並追加到指定行下邊。
#將r.txt檔案內容讀取並插入到message檔案第1行的下邊

sed

'1r r.txt'

message

(8)s
子命令s為替換子命令,是平時sed使用的最多的子命令,沒有之一。因為支援正則表示式,功能變得強大無比,下邊來詳細地說說子命令s的使用方法。

基本語法:

[address]s/pattern/replacement/flags
  • flags
flags 說明
n 可以是1-512,表示第n次出現的情況進行替換
g 全域性更改
p 列印模式空間的內容
w file 寫入到一個檔案file中
#b全域性換成x

sed

's/b/x/g'

message

4)例項

(1)test.txt的第一行前插入“a new line”

sed -i

'1i\a new line'

text.txt

(2)在第三行新增一行

sed -i

'3a \a new line'

text

3、awk

awk是一個文字處理工具,用於對文字或資料進行模式掃描和處理。它可以根據定位到的資料行處理其中的分段,並進行資料切片或執行其他操作。awk命令非常適合進行資料提取和報告生成等任務,是Linux系統中進行文字和資料處理的利器。

1)基本概念

awk是結構化資料處理程式;

awk是一門數處理領域的語言;

awk擁有c語言式的語法結構,例如print是語句,但不是函式;

(1)語法

awk [選項] '匹配規則和處理規則 ' [處理文字路徑]

  • 匹配規則主要是:正則表示式、字串
  • 處理規則主要是:設定變數、設定陣列、定義函式(用的比較少)、陣列迴圈、加減乘除運算、字串拼接
(2)命令格式為:

awk [選項]

'BEGIN{定義1;定義2;}/模式/{操作1;操作2}END{操作1;操作2}'

file1 file2

選項:如

-F:

指定分隔符為:

BEGIN{} : BEGIN是在awk處理文字之前執行

/模式/ : 使用的匹配規則,模式為正則或者字串

{} :迴圈(每次只處理一行資料),如

{print $1}

列印第一列

END{} :當所有的處理全部執行完畢之後,執行END中的相關操作

2)運算子:~、==、!=、>等

如:
#當前行匹配以a開頭成功時則執行後面的列印

awk

'/^a/ {print $1}'

上面正則匹配的範圍是整行的內容,如果只想匹配指定欄位的內容,則可以這樣使用:

awk

'$n~/^1/ {print $1}'

透過~符號規定了正則的匹配操作範圍【這裡是欄位n】,~叫做匹配運算子

3)BEGIN和AND:

BEGIN

裡面可以列印一些字串,或者定義變數(變數名="值" ,值不是數字的話,必須要用雙引號括起來,引用變數的時候,變數前面是不要加$的)。

END

裡面可以列印一些字串,或者進行最終的計算。如果在BEGIN裡面沒有定義變數的話,最終也可以引用這個變數的,只是變數值為空,在awk裡面變數是可以不預先定義;

4)選項

引數 解釋
-F 指定分割欄位符
-v 定義或修改一個awk內部的變數
-f 從指令碼檔案中讀取awk命令

5)常見變數:

內建變數 解釋
FS 預設輸入列分隔符(空格和tab)
OFS 預設輸出列分隔符(空格)
NF 每行有幾段(列)(print $NF代表列印最後一列)
RS 預設輸入行分隔符(\n)
ORS 預設輸出行分隔符(\n)
FILENAME 當前所操作檔名稱
NR 讀取每行時當前的行號(對於合併檔案來說,不同檔案行號連續顯示)
FNR 讀取每行時顯示當前的行號(對於合併檔案來說,不同檔案行號不連續顯示)
$0:表示當前整行,$1表示第一個欄位,$2表示第二個欄位,$n 表示第n個欄位;

6)判斷:

7)例項

(1)預設分隔符是空格和tab,列印第二列

ps |awk

'{print $2}'

(2)分隔符是冒號,列印第一、二列,並用空格分隔

awk -F

":"'{print $1,$2}'

/etc/passwd

(3)分隔符是冒號,列印第一、二列,並用指定符號分隔

awk -F

":"'{print $1"--"$2}'

/etc/passwd

(4)分隔符是冒號和逗號,列印第一、二列,並用指定符號分隔

awk -F

"[:,]"'{print $1"--"$2}'

/etc/passwd

(5)預設分隔符,列印以d開頭的行的第一列

docker ps |awk

'/^d/ {print $1}'

(6)預設分隔符,列印第n列以d開頭的行的第一列

docker ps |awk

'$n~/^d/ {print $1}'

(7)在列印前指定分隔符變數FS為冒號和逗號

awk

'BEGIN{FS="[:,]"}{print $1}'

/etc/passwd

(8)在列印前指定分隔符變數FS為冒號和逗號,定義變數line

awk

'BEGIN{FS="[:,]";line=1}{print $line}'

/etc/passwd

(9)定義變數sum計算和,每次輸出計算結果,最終輸出

awk

'BEGIN{FS="[,:]";sum=0}{sum+=$3;print sum}END{print "sum=",sum}'

/etc/passwd

(10)列印當前檔名稱
awk '{pring FILENAME}' /etc/passwd
連結:https://www.cnblogs.com/hoaprox/p/18269422
(版權歸原作者所有,侵刪)


相關文章