天天看點

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

linux文本處理工具

  • 1.grep
    • 1.字元的過濾grep
    • 2.grep的基礎搜尋文本指令
    • 3.grep指令字元數量比對規則
  • 2.sed 字元替換
    • p 顯示
    • d 删除
    • a 添加
    • c 替換
    • w 寫入(将符合條件的行寫入指定檔案中)
    • i 插入
    • r 整合(整合檔案内容到指定行)
    • s 替換關鍵字
  • 3.awk
    • awkd的用法
  • 練習:

1.grep

1.字元的過濾grep

grep指令是linux下的文本處理工具,這些指令都是用于對一個檔案和文本執行重複搜尋的工具。我們可以通過grep指令指定特定的搜尋條件來搜尋檔案及其内容以擷取有用的資訊。 grep時全局搜尋,其抓取資料是貪婪模式,即不會漏掉過濾内容,但準确性也會降低

2.grep的基礎搜尋文本指令

egrep = grep -E

grep -e ”root|nologin“ passwd 搜尋含有root和nllogin的行 = grep -e root -e nologin passwd (同時過濾兩個目标)

grep -i root passwd 忽略大小寫

grep -E “<root” passwd 搜尋字元不能有字首

grep -E “root>” passwd 搜尋字元不能有字尾

grep -E “<root>” passwd 搜尋字元前後都不能有字尾

grep -n westos passwd 顯示比對的行所在行号

grep -5 westos passwd 顯示過濾行及前後5行将會顯示

grep -B5 westos passwd 顯示含有關鍵字的行及以上5行

grep -A5 westos passwd 顯示含有關鍵字的行及以下5行

grep -v root passwd 顯示不含有root的過濾行(反選)

3.grep指令字元數量比對規則

grep ^westos westos 以westos開頭

grep westos$ westos 以westos結尾

grep w.s westos ws之間有任意一個字元的

grep w…s westos ws之間有任意三個字元的

grep -E “w.*s“ westos 表示字元出現了任意次

grep -E "was" westos a出現了任意次

grep -E “wa{2}s” westos a出現了兩次

grep -E “wa?s” westos a出現了0-1次

grep -E ‘w.+s’ westos 含有任意字元出現一次以上

grep -E ‘w.{3,}s’ westos 含有最少三個任意字元

grep -E ‘w.{,3}s’ westos 最多三個

grep -E ‘w.{1,3}s’ westos 1-3個

grep -E ‘w(ab){3,}s’ westos 含有字元串最少3個的所在行

練習:

使用腳本把主機中可以su切換的使用者過濾出來

#!/bin/bash
grep -E "bash$|sh$" /etc/passwd | cut -d : -f 1

           

2.sed 字元替換

不輸出模式空間的内容,隻輸出處理過的内容

p 顯示

sed -n 5p passwd 顯示第五行内容

cat -b passwd | sed -n 3,5p 顯示3-5行

cat -b passwd | sed -n ‘3p;5p’ 顯示3行和5行 (-b 顯示輸出行号)

cat -b passwd | sed -n ‘/^root/p’ 顯示root開頭的行

sed -n ‘bash / p ′ p a s s w d 顯 示 以 b a s h 結 尾 的 行 s e d − n ′ 5 , /p' passwd 顯示以bash結尾的行 sed -n '5, /p′passwd顯示以bash結尾的行sed−n′5,p’ passwd 顯示第5行到最後一行

sed -n ‘$p’ passwd 顯示最後一行

d 删除

cat -b passwd | sed ‘5,8d’ 删除5-8行

cat -b passwd | sed -e ‘5d;8d’ 删除5和8行

sed -e ‘/^root/d’ passwd 删除以root開頭的行

sed -e ‘/bash$/d’ passwd 删除bash結尾的行

a 添加

sed ‘2aleeleelee’ westos 在第2行之後添加leeleelee

sed ‘hello/aleeleelee’ westos 在hello後加leeleelee

sed ‘$aleeleelee’ westos 在最後一行後面加leeleelee

c 替換

sed ‘1chahaha’ westos 第一行替換為hahaha

sed ‘/linux/chahaha’ westos 将linux替換為hahaha

w 寫入(将符合條件的行寫入指定檔案中)

sed ‘/nologin$/wwestosfile’ passwd 将passwd中以nologin結尾的行全部寫入到westosfile中

i 插入

r 整合(整合檔案内容到指定行)

sed ‘2rlee’ westos 将lee整合到westos中的第二行之後

sed ‘hello/rlee’ westos 将lee檔案内容整合到westos中hello行之後

s 替換關鍵字

(g表示所有關鍵字的列,如果不加g則預設替換每行出現的第一列)

sed ‘s/a/b/g’ test 将test中的a全部替換成b

sed ‘s/sbin/westos/g’ passwd 将sbin替換為westos

sed ‘4,5s/sbin/westos/g’ passwd 4-5行的sbin替換成westos

sed ‘$s/sbin/westos/g’ passwd 最後一行

sed ‘s///###/g’ passwd 将全文的/替換為#,\是轉譯/不是指令而是單純的字元 或者可以将/寫成@ 即 sed ‘s@/@###@g’ passwd

儲存:

sed ‘s@/@###@g’ -i passwd 将sed處理的内容儲存在原檔案中

練習:

編寫一個腳本,使得其可以輸入一個端口,http的端口就改為這個數字

思路:

1.先確定運作腳本時輸入了數字,不能為空

2.确認主機下載下傳了該服務

3.确認服務已經啟動

4.改變http配置檔案的端口,并重新開機

5.顯示http服務改變後的端口

#!/bin/bash
setenforce 0 &> /dev/null

[ -z "$1" ] && {
        echo "Errow:Please input port following script !!"
        exit
}

rpm -q httpd &> /dev/null || {
        echo "Errow:Apache is not installed !!"
        exit
}

systemctl status httpd | grep "running" &> /dev/null || {
        echo "Eroow:Apache is not running !!"
        exit
}

netstat -antlupe | grep -E ":$1\>" &> /dev/null && {
        echo "Errow: $1 is in used !! "
        exit
}

sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

netstat -antlupe | grep http
           

3.awk

awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對資料分析并生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符将每行切片,切開的部分再進行各種分析處理。

$0 表示顯示所有列

$1 隻顯示第一列

$2 隻顯示第二列

awkd的用法

(1) 使用awk指令,首先輸出顯示westos,接着-F指定以:為分隔符截取顯示passwd檔案的第一列,最後輸出顯示end

#BEGIN:運作處理政策之前的動作 print $1: 處理動作 END:處理結束所作事情

注意: ‘ ’引起來的截取政策中的字元串需要用“ ”引起來,否則awk指令會将其當作變量處理(即不會輸出顯示指定字元串本身)

awk -F : BEGIN’{print “name”}{print $1}END{print “end”}’ westos

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:
linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

(2)使用awk指令統計passwd檔案行數:給變量N賦初值為0,awk每讀取一行檔案内容變量N就進行一次自加操作,最後輸出變量N的值即為passwd檔案的行數

awk -F : ‘BEGIN{westos=0}{westos++}END{print westos}’ westos

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

(3)

awk -F : ‘{print NF}’ westos NF表示統計列數

awk -F : ‘{print NR}’ westos NR表示統計行數

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:
linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

awk -F : ‘/nologin$/{print $1,$7}’ westos 顯示以nologin結尾的行

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

awk -F : ‘/nologin$|^root/{print $1,$7}’ westos 條件中兩個元素是或的關系,以nologin結尾或root開頭

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

awk -F : ‘/bash$/&&/^root/{print $1,$7}’ westos 兩個條件是且的關系,同時符合bash結尾以root開頭

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:
awk -F : '$7~/bash$/{print $0}' westos    
#顯示第7列是以bash結尾的結果(結果顯示所有列)
awk -F : '$7!~/bash$/{print $0}' westos   
#第7列不是以bash結尾的
awk -F : '{print FILENAME}' westos     #FILENAME:要處理的檔案名稱
           
linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:
linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:
linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

練習:

用awk指令找出主機中可以登陸且家目錄不在/home下的使用者數量

awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd 
           
linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

用awk指令一次抓取出ifconfig中的ip

linux文本處理工具——grep、sed、awk用法1.grep2.sed 字元替換3.awk練習:

繼續閱讀