簡單的 grep sed awk

grep的一些命令參數

-A num:匹配到搜索到的行以及該行下面的num行
-B num:匹配到搜索到的行以及該行上面的num行
-C num:匹配到搜索到的行以及上下各num行
-i ---忽略字符大小寫的差別
-c ---計算符合樣式的列數
-v ---顯示不包含匹配文本的所有行
-o ---只顯示匹配部分
-E ---支持擴展正則
-n ---標示出該行的列數編號
-r ---以遞歸的方式查找符合條件的文件
-w ---只顯示全字符合的列

三劍客sed命令概念介紹

作用說明:  stream editor for filtering and transforming text
           文件處理編輯命令
原理過程:  按照文件每行信息進行處理, 找出符合條件信息, 執行相應操作
語法結構:  sed [參數] '條件 指令操作'  文件信息

如何進行查詢

a 按照行號查詢信息

查找單行信息: sed -n '3p' 文件信息
查找多行信息: sed -n '2,4p' 文件信息 連續多行
sed -n '2p;4p' person.txt 不連續多行
sed -n '2,p' 文件信息代表末尾

b 按照字符查詢信息

查找單行信息: sed -n '/CTO/p' person.txt
查看多行信息: sed -n '/CTO/,/CIO/p' person.txt
sed -n '/CTO/p;/CIO/p' person.txt

如何進行刪除

sed -i '6d' person.txt
sed -i.bak '/COO/d' person.txt --- 將源文件內容先進行備份, 在進行操作
sed -ri '/CFO|CTO/d' person.txt

坑: 刪除一個文件有#號的行
1) 查詢需要刪除內容
sed -n '/^#/p' config

  1. 刪除文件信息
    sed -i '/^#/p' config
    PS:
  1. -i參數后面不能再跟上其他參數
  2. -i參數和-n參數盡量不要結合使用
    -i : 真正修改文件內容

sed顯示行號 sed ‘=’ xxx.txt | xargs -n2

如何進行添加

3a: 在第三行的下面添加相應信息
3i: 在第三行的上面添加相應信息
添加多行: \n 轉移換行
sed -i '2a103,Alex,COO\n104,yy,CFO' person.txt

-e : 表示可以識別多個操作信息
sed -e '2i103,Alex,COO' -e '3a104,yy,CFO' person.txt

如何進行修改

sed 參數 's#需要替換信息#替換成什么信息#g' 文件信息

sed 's#CEO#CIO#g' person.txt --- 指定條件進行替換 sed -i "s#Init_IP#Change_IP#g"File_info --- 指定變量信息做替換需要注意雙引號使用

后向引用前項替換: 
[root@linux67 scripts]# echo 1234|sed -r 's#(12)(34)#\1#g'
12
[root@linux67 scripts]# echo 1234|sed -r 's#(12)(34)#\2#g'
34
[root@linux67 scripts]# echo 1234567890|sed -r 's#.*#<&>#g'
<1234567890> 

練習題: 利用sed命令取出IP地址信息
思路1) 顯示出IP地址
ip a s eth0 
思路2) 有IP地址的行顯示出來
ip a s eth0|sed -n '3p'
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
思路3) 取出IP地址
ip a s eth0|sed -n '3p'|sed -r 's#^.*et (.*)#\1#g'|sed -r 's#(.*)/24.*$#\1#g'

sed -r 's#^.*et (.*)#\1#g'
sed -r 's#(.*)/24.*$#\1#g'   
ip a s eth0|sed -n '3p'|sed -r 's#^.*et (.*)/24.*$#\1#g'

sed -n '3p'
sed -r 's#^.*et (.*)/24.*$#\1#g'
ip a s eth0|sed -nr '3s#^.*et (.*)/24.*$#\1#gp'

sed命令應用總結
sed命令參數總結:
-n : 取消默認輸出
-e : 識別多操作指令
-r : 識別擴展正則
-i : 真正編輯修改文件內容

sed命令指令信息:
p : 輸出顯示指定信息
d : 刪除指定信息
s : 替換指定信息
g : 全局替換信息
a : 添加指定信息在相應行的后面
i : 插入指定信息在相應行的前面
c : 將一行信息進行替換修改 sed '2c oldxuan' 1.txt 把1.txt的第二行改成了oldxuan

三劍客awk命令概念介紹

概念說明: pattern scanning and processing language
          模式識別和腳本編寫
執行原理: 按行處理文件信息, 根據匹配條件信息, 完成相應操作動作
語法結構: awk [參數] '模式信息(條件) {動作}'  文件信息

如果想對文件里的格式加以調整可以使用column -t 奧找表格的形式一列一列呈現


image.png

顯示xiaoyu的姓氏和ID號碼 NR表示行信息 number row 行號的意思

a 可以根據行號信息進行處理
將xiaoyu信息進行匹配
awk 'NR==2' /oldboy/awk_test.txt

根據需求進行處理
awk 'NR==2{print 13}' /oldboy/awk_test.txt

執行過程:
[root@linux67 ~]# awk 'NR==2{print 1,3}' /oldboy/awk_test.txt
Zhang 390320151
[root@linux67 ~]# awk 'NR==2{print 1" "3}' /oldboy/awk_test.txt
Zhang 390320151
說明: awk取出多列信息可以使用 , 或者 " " 進行分隔

b 可以根據內容信息進行處理 ~是匹配的意思
思路1) 將xiaoyu信息進行匹配
awk '$2~/Xiaoyu/' /oldboy/awk_test.txt

思路2) 根據需求進行處理
awk '2~/Xiaoyu/{print1,$3}' /oldboy/awk_test.txt

awk可以對列分隔符號進行修改 -F "分隔符號"

awk -F ":" '{print 3}' test.txt awk可以對列分隔符號進行修改, 并且可以指定多個分隔符號 -F "[分隔符號01分隔符號02]" awk -F "[:>]" '{print3}' test.txt
awk '1~/Zhang/' awk_test.txt awk -F "[ :]+" '1~/Zhang/{print 1,2,$5}' awk_test.txt

顯示所有以41開頭的ID號碼的人的全名和ID號碼

awk '3~/^41/{print1,2,3}' awk_test.txt
awk '3~/^41/{print1,2,3}' awk_test.txt |column -t

顯示所有ID號碼最后一位數字是1或5的人的全名

awk '3~/1|5/' awk_test.txt awk '3~/[15]$/' awk_test.txt

顯示全名信息:awk '3~/[15]/{print 1,2}' awk_test.txt
顯示所有ID號碼最后一位數字不是1或5的人的全名:
awk '3~/[02346789]/{print 1,2}' awk_test.txt
awk '3~/[^15]/{print 1,2}' awk_test.txt
awk '3!~/[15]/{print 1,2,$3}' awk_test.txt

顯示Xiaoyu的捐款,每個捐款數值都有以開頭, 如110220330

awk -F "[: ]+" '2~/Xiaoyu/{print ""4,""5,""6}' awk_test.txt awk '2~/Xiaoyu/{print 4}' awk_test.txt |sed 's#:##g'
awk '2~/Xiaoyu/{print4}' awk_test.txt |tr ':' '' print : 輸出指定的信息 gsub : 替換指定的信息 gawk substitute -- gsub gsub(//,"",x) --> gsub(/要替換的信息/,"替換成什么信息",第幾列信息做替換) gsub(/:/,"",)
awk '2~/Xiaoyu/{gsub(/:/,"",NF);printNF}' awk_test.txt
15590201 說明: NF表示列信息,NF表示最后一列, ? 倒數第二列 == 3NF == 4 - 1 錯誤理解 oldboy linux edu 50(NF-1) (NF)(4-1) 44==NF==50NF-1==50-1=49

總結:
awk用到的參數: -F 指定列分隔符號
awk用到的動作: print 輸出指定的信息
gsub 替換指定的信息
awk內置的變量: NR 表示行號信息
NF 表示列號信息

三劍客awk命令高級使用

模式概念:
匹配條件信息 普通
a 根據正則信息進行
b 根據范圍信息進行
匹配連續的多行
[root@linux67 oldboy]# cat test.txt
01 oldboy python
02 oldboy ptone
03 oldboy path
04 oldboy ptzh
05 oldboy ptzh
06 oldboy ptzh
07 oldboy ptzh
[root@linux67 oldboy]# awk 'NR>2' test.txt
03 oldboy path
04 oldboy ptzh
05 oldboy ptzh
06 oldboy ptzh
07 oldboy ptzh
[root@linux67 oldboy]# awk 'NR<5' test.txt
01 oldboy python
02 oldboy ptone
03 oldboy path
04 oldboy ptzh
[root@linux67 oldboy]# awk 'NR>2 && NR<5' test.txt
03 oldboy path
04 oldboy ptzh
[root@linux67 oldboy]# awk 'NR==2,NR==5' test.txt
02 oldboy ptone
03 oldboy path
04 oldboy ptzh
05 oldboy ptzh

匹配不連續多行
[root@linux67 oldboy]# awk 'NR==2||NR==5||NR==7' test.txt
02 oldboy ptone
05 oldboy ptzh
07 oldboy ptzh
[root@linux67 oldboy]# awk 'NR==2;NR==5;NR==7' test.txt
02 oldboy ptone
05 oldboy ptzh
07 oldboy ptzh

特殊模式

BEGIN: 在文件處理之前完成相應操作
awk 'BEGIN{print "姓","名","ID","捐款記錄"}{print 0}' awk_test.txt |column -t END: 在文件處理之后完成相應操作 awk 'BEGIN{print "姓","名","ID","捐款記錄"}{print0}END{print "人員捐款記 錄表"}
可以實現數值運算 --- 計算器
[root@linux67 oldboy]# awk 'BEGIN{print 2+3}'
5
[root@linux67 oldboy]# awk 'BEGIN{print 2-3}'
-1
[root@linux67 oldboy]# awk 'BEGIN{print 2*3}'
6
[root@linux67 oldboy]# awk 'BEGIN{print 2^3}'
8
[root@linux67 oldboy]# awk 'BEGIN{print 2/3}'
0.666667

內置變量:
NR : 表示行的信息
NF : 表示列的信息
FS : 表示指定分隔符號
[root@linux67 oldboy]# awk 'BEGIN{name="oldgirl"}2~/Xiaoyu/{print name,1,2}' awk_test.txt oldgirl Zhang Xiaoyu [root@linux67 oldboy]# awk 'BEGIN{name="oldgirl"}2~/Xiaoyu/{print "name",1,2}' awk_test.txt
name Zhang Xiaoyu

[root@linux67 oldboy]# awk -F "[ :]+" '1~/Zhang/{print1,2,5}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90
[root@linux67 oldboy]# awk 'BEGIN{FS="[ :]+"}1~/Zhang/{print1,2,5}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90
[root@linux67 oldboy]# awk -vFS="[ :]+" '1~/Zhang/{print1,2,5}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90

內置變量:
NR : 表示行的信息
NF : 表示列的信息
FS : 表示指定分隔符號

  1. 可以實現信息統計
    如何進行累加運算 --> i=i+1 初始i=0 經過一次運算 i=1 經過運算 i=2
    說明:
    [root@linux67 oldboy]# awk '$(NF-1)~/男生/' test.txt
    武佳偉 Linux67 小白 15000 男生 大學 匹配一次男生信息 做一次運算 i=i+1 == i=0+1 i=1
    顧宏磊 Linux67 經驗 13000 男生 大專 匹配二次男生信息 做一次運算 i=i+1 == i=1+1 i=2
    柴仁義 Linux67 畢業 12000 男生 大學 匹配三次男生信息 做一次運算 i=i+1 == i=2+1 i=3

實現過程:
[root@linux67 oldboy]# awk '(NF-1)~/男生/{i=i+1;print i}' test.txt 1 2 3 [root@linux67 oldboy]# awk '(NF-1)~/男生/{i=i+1}END{print i}' test.txt
3
[root@linux67 oldboy]# awk '(NF-1)~/男生/{i=i+1}END{print "班級男生數量"i}' test.txt 班級男生數量3 [root@linux67 oldboy]# awk '(NF-1)~/男生/{i=i+1}END{print "班級男生數量:",i}' test.txt
班級男生數量: 3

如何進行求和運算 ---> i=i+nn表示需要進行求和運算列信息
武佳偉 Linux67 小白 15000 男生 大學 15000 做求和運算 i=i+4 --> i=0+15000 print i 15000 顧宏磊 Linux67 經驗 13000 男生 大專 13000 做求和運算 i=i+4 --> i=15000+13000 print i 28000
柴仁義 Linux67 畢業 12000 男生 大學 12000 做求和運算 i=i+4 --> i=28000+12000 print i 40000 隨文悅 Linux67 肄業 14000 女生 大學 14000 做求和運算 i=i+4 --> i=40000+14000 print i 54000

[root@linux67 oldboy]# cat test.txt
武佳偉 Linux67 小白 15000 男生 大學
顧宏磊 Linux67 經驗 13000 男生 大專
柴仁義 Linux67 畢業 12000 男生 大學
隨文悅 Linux67 肄業 14000 女生 大學
[root@linux67 oldboy]# awk '{i=i+4;print i}' test.txt 15000 28000 40000 54000 [root@linux67 oldboy]# awk '{i=i+4}END{print i}' test.txt
54000
[root@linux67 oldboy]# awk '{i=i+$4}END{print i/4}' test.txt
13500

END: 在文件處理之后完成相應操作
[root@linux67 oldboy]# awk 'BEGIN{print "姓","名","ID","捐款記錄"}{print $0}END{print "人員捐款記 錄表"} awk_test.txt
姓 名 ID 捐款記錄
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
人員捐款記錄表

作用:

  1. 輸出最終結果信息
    說明: $0 將每一列信息都進行輸出
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。