1. 程式人生 > >Linux中的cut、grep、awk、sed

Linux中的cut、grep、awk、sed

1、grep

可以使用grep 命令可以進行過濾搜尋

aaa.txt 的內容

2018-11-26
hello world!
hadoop01 bigdata
192.168.136.138
2018-09-21
2018-09-12 spark scala

從aaa.txt中搜索一個固定的詞語,通過結果可以看出每次搜尋,只要有這個詞語,就會把一整行都顯示出來

(1) grep “2018-11-26” aaa.txt
(2)cat aaa.txt | grep “2018”
結果
2018-11-26
2018-09-21
2018-09-12 spark scala

使用正則表示式進行搜尋

grep “[0-9]{4}-[0-9]{2}-[0-9]{2}” aaa.txt
這裡是使用正則表示式對文字內容進行搜尋,搜尋的格式xxxx-xx-xx (x的範圍在0-9) \是進行轉義
結果:
2018-11-26
2018-09-21
2018-09-12 spark scala

使用正則搜尋 ip格式的資料 (不太準確,可能會出現999.999.999.999,這個根本就不可能是IP)
grep “[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}” aaa.txt
192.168.136.138

取反

這裡/etc/passwd是存放一些使用者的資訊,
想要找在這裡搜尋出普通使用者,通過觀察發現 使用者資訊都是/bin/bash 結束
使用grep先搜尋到 /bin/bash ,再使用grep -v " root" 把是root使用者的刪除,
grep “/bin/bash” /etc/passwd | grep -v “root”
結果:
bigdata: x: 500:500::/home/bigdata:/bin/bash

2、cut
可以使用cut對資料進行切分
cut命令預設切分時是按照\t進行切分,也可以自己設定切分的字元,通過-F,下面匯聚一些具體的例子

student.txt 的資料, 分隔符是\t
id name gender mark
01 zh man 70
02 ty woman 77
02 ym woman 80
03 cx woman 80

(1) 取出資料中的第三列 ,
cut -f 3 student.txt
gender
man
woman
woman
woman

(2) 取出1到3 列
cut -f 1-3 student.txt
(3)取出第1、第3列
cut -f 1,3 student.txt

只取出普通使用者的使用者名稱
在grep取反時,使用了以下的一部分命令,使用 cut 按 : 進行切分,再取出第一個,也就是普通使用者名稱
grep “/bin/bash” /etc/passwd | grep -v “root” | cut -f 1 -d “:”
結果:
bigdata01

cut 雖然可以進行切分,但是卻存在一些問題,就比如你的要的字元之間不是一個分隔符,而是多個分隔符,那麼使用cut是不行的。但是我們可以通過使用awk做到這個要求
就比如下面的df-h 如果想要取出Avail ,他們每個欄位之間是不確定個數的空格,使用cut是不行的
在這裡插入圖片描述
使用df -h | cut -f 2 -d " " 最後沒有結果
在這裡插入圖片描述
3、awk
awk切割的預設是 空白字元,包括空格、\t等
在awk命令的輸出中支援print和printf命令,print和c、java不同,print預設是會進行換行的,但是linux中是不支援print的。printf是不會進行換行,是標準格式輸出命令
awk操作:
awk ‘條件1{動作1}條件2{動作2}{動作3}…’ 檔名

條件:

一般使用關係表示式作為條件
如x > 10 判斷變數x 是是否大於 10

動作

1、格式化輸出
2、流程控制語句

預設是切割空白符,取出每行的第2、4列,注意如果在使用\n 、\t時 要用雙引號引著
awk ‘{printf $2 “\t” $ 4 “\n”}’ student.txt

在這裡插入圖片描述

使用awk 命令 把 df -h中的每一行進行切分(類似java中\s,切割空白字元),再取出Avail對應的欄位的列,但是把Avail去掉
df -h | awk ‘{print $4}’ | grep -v “Avail”

在這裡插入圖片描述

制定分割符:

取出 /etc/passwd檔案中的普通使用者
grep “/bin/bash” /etc/passwd | awk ‘BEGIN{FS=":"}{printf $1 “\n”}’
或者 -F 可以指定分隔符
grep “/bin/bash” /etc/passwd | awk -F “[:]” ‘{printf $1 “\n”}’
或者
grep “/bin/bash” /etc/passwd | awk -F : ‘{printf $1 “\n”}’
想要使用多個分割符時,以逗號 冒號 空格 為分割符
echo “ab dd,dd:KK” | awk -F “[,: ]” ‘{printf $1 “\t” $2 “\t” $3 “\t” $4 “\n”}’

注意: 在使用非空格作為分割符時,如果使用
grep “/bin/bash” /etc/passwd | awk ‘{FS=":"}{printf $1 “\n”}’
結果如下,並不會對資料的第一行進行切分,所以要在動作前加上BEGIN,或者使用-F進行切分
root: x:0:0:root:/root:/bin/bash
bigdata

在這裡插入圖片描述
多個分割符
在這裡插入圖片描述

‘條件 {動作}’

grep -v “mark” student.txt | awk ‘$4>76{printf $2 “\n”}’
取出成績大於76 的同學的名字
在這裡插入圖片描述

對於 ‘條件1{動作1}{動作2}’ 這種型別的

是一個條件對應一個動作,當動作前面沒有條件時,那麼這個動作可以不滿足任何條件
就拿下面的例子來說,先選出成績大於76的學生的姓名,這是一組條件和動作,接著又列印學號, 可以看到成績大於76的學生一共有3個,打印出來的姓名有3個,但是學號有4個,所以一個動作只需要滿足它所對應的條件即可
在這裡插入圖片描述

BEGIN END

加不加BEGIN的差別:

不加BEGIN
awk ‘{printf “aaaa” “\t”}{printf $1 “\t” $2 “\n”}’ student.txt
在這裡插入圖片描述
加BEGIN
awk ‘BEGIN{printf “aaaa” “\t”}{printf $1 “\t” $2 “\n”}’ student.txt
在這裡插入圖片描述
加END
在這裡插入圖片描述
加上BEGIN時 第一個動作只會列印一遍,不加BEGIN,第一個動作和第二個動作執行的次數一樣,加END是把第一動作放到最後執行且只執行一遍

4、sed
sed是一種幾乎包括在所有UNIX平臺(包括Linux)的輕級流量編輯器,sed主要是用來將資料進行選區、替換、刪除、新增的命令

sed[選項] ‘[動作]’ 檔名

選項:

-n : 一般sed命令會把所有的資料輸出到螢幕,如果加入此選擇則只會把進過處理的sed命令的行輸出到螢幕。
-e : 允許對輸入資料應用多條sed命令編輯
-i : 用sed的修改結果直接修改讀取資料的檔案,而不是在螢幕上輸出
-a : 追加,在當前行後新增一行或多行資料
-i : 插入,在當前行前插入一行或多行。
-d : 刪除刪除指定行
-p : 列印,輸出指定的行
-s : 字串替換,用一個字串替換另一個字串,格式為"行範圍s/舊字串/新字串/g"

檢視第二行的資料
sed -n ‘2p’ student.txt

在這裡插入圖片描述

刪除指定行的資料
sed ‘1,2d’ student.txt 不會刪除原資料,把結果列印到螢幕上
sed -i ‘1,2d’ student.txt 會刪除原資料
在這裡插入圖片描述

增加資料
指定行後增加資料
sed ‘2a 01\tty\twoman\t76’ student.txt
sed -i ‘2a 01\tty\twoman\t76’ student.txt
指定行後增加資料
sed ‘2i 06\tnn\twoman\t76’ student.txt
sed -i ‘2i 06\tnn\twoman\t76’ student.txt

在這裡插入圖片描述
在指定行前加資料
在這裡插入圖片描述

替換

替換指定行(如果想修改原檔案 在sed 後加 -i即可)
sed -i ‘2c 06\tkk\twoman\t77’ student.txt 替換第二行的內容
替換指定字串
sed ‘3s/03/04/g’ student.txt
在這裡插入圖片描述
替換多個字串 使用 -e
sed -e ‘2s/06/01/g;3s/01/03/g’ student.txt
2s 和 3s 分別表示要替換的行,後面跟的都是老字串 新字串
在這裡插入圖片描述
替換多個字串並修改原檔案 使用-ne
sed -ie ‘1s/02/01/g;2s/01/02/g’ student.txt
在這裡插入圖片描述