shell中的文字處理之grep,sed,awk

2021-09-22 21:21:11 字數 3733 閱讀 4015

1 grep文字過濾命令

grep中的正規表示式

grep ^root passwd #過濾以root開頭的行

grep root$ passwd #過濾以root結尾的行

grep -i ^root passwd #不區分大小寫,過濾以root開頭的行

grep -e "^root | root$" passwd #過濾以root開頭或root結尾的行,-e表示擴充套件正規表示式

grep -e -v "^root | root$" passwd # -v 表示反向過濾

grep -e -v "^root | root$" passwd |grep root #過濾root在中間的行

grep -i root passwd | grep -v -i -e "^root | root$" #過濾root在中間的行

grep 'r.t' test #過濾r和t之間只有乙個字元

grep 'r..t' test #過濾r和t之間有兩個字元

grep 'r...t' test #過濾r和t之間有三個字元

grep 'r*t' test # 過濾r出現的任意次數

grep 'r\**t' test #過濾r,t之間有0個字元

grep 'ro*t' test #過濾r和t之間o出現的任意次數

grep -e 'ro*t' test #過濾r和t之間o出現的任意次數

grep -e 'ro?t' test #過濾r和t之間o出現的0和1次

grep -e 'rot' test #過濾r和t之間o出現的1次以上

grep -e 'rot' test #過濾r和t之間o出現的3以下的次數

grep -e 'r....' test #過濾r之後出現4個字元

grep -e 'r....\' test#精確匹配

grep -e '\<....r' test #過濾r之前出現4個字元

應用: 編寫指令碼檔案,使輸出可以登入系統的使用者

vim show_loginuser.sh

#!/bin/bash

shell=$(echo `grep -v nologin /etc/shells ` | sed 's//|/g')

grep -e "$shell" /etc/passwd | cut -d : -f l

2 sed 行編輯器

p模式(顯示)

sed -n '^:/p' fstab #顯示fstab中以:開頭的行

sed -n 'uuid$/p' fstab #顯示fstab中以uuid結尾的行

sed -n '/^uuid/p' fstab #顯示fstab中以uuid開頭的行

sed -n '2,6p' fstab #顯示fstab中的第二行和第六行

sed -n '2,6!p' fstab #顯示fstab中除過第二行和第六行其餘的行

d模式(刪除,只是顯示的時候刪除,並不刪除原檔案)

sed '/^uuid/d' fstab #刪除以uuid開頭的行

sed '/^#/d' fstab #刪除以#開頭的行

sed '/^$/d' fstab #刪除以空格開頭的行

sed '/^uuid/!d' fstab #刪除不是以uuid開頭的行

cat -n fstab | sed '1,4d' #刪除1到4行

cat -n fstab | sed -e '2d,6d' #刪除第二行和第六行

a模式(新增,預設在最後一行新增)

sed '/^uuid/a\hello' fstab #在以uuid開頭的行的前一行新增hello

sed '/^uuid/a\hello' \newstos fstab #在以uuid開頭的行的前一行新增hello換行再新增westos

i模式(插入)

sed '/^uuid/i\hello' fstab #在uuid的前一行新增hello
c模式(替換)

sed '/^uuid/c\hello'  fstab #把以uuid開頭的行替換成hello
w模式(寫入)

sed '/^uuid/wwestos' fstab

sed -n '/^uuid/wwestos' fstab

sed '/^uuid/=' fstab #顯示以uuid開頭所在的行號

sed '6r westos' fstab

3 awk報告生成器

awk處理機制:awk會逐行處理文字,支援在處理第一行之前做一些準備工作,以及在處理完最後一行,做一些總結性質的工作,在命令格式上分別體現如下:

begin{}:讀入第一行文字之前執行,一般用來初始化操作

{} :逐行處理,逐行讀入文字執行相應的處理,是最常見的編輯指令塊

end{} :處理完最後一行文字之後執行,一般用來輸出處理結果

awk -f ":" '' passwd #以:為分隔符,顯示第一列

awk -f ":" 'begin' passwd #以name開始顯示第一列

awk -f ":" 'beginend' passwd #以name開始,以end結束,顯示第一列並顯示行號

awk -f ":" 'beginend' passwd #顯示行號並換行

awk -f ":" '/bash$/' passwd #sh 結尾的行第一列,$1表示第一列

awk -f ":" 'begin/bash$/end' passwd #統計passwd中以bash結尾的行數

awk -f '/^ro/' passwd #列印以ro開頭的行

awk -f '/^[a-d]/' passwd #列印以a到d開頭的行

awk -f '/^a|nologin$/' passwd #列印以a開頭或者以nologin結尾的行

awk -f ":" '$1~/^r/' passwd#列印以r開頭的行

awk -f ":" '$1!~/^r/' passwd#列印不以r開頭的行

awk -f ":" '' passwd #以:為分隔符列印第一列,並表示行號,$0表示檔案一整行的內容

應用:

1 計算顯示能夠登入系統的使用者個數

awk -f ":" 'begin$5!~/^\/home/&&/bash/end' /etc/passwd
2 找出系統中可以登入系統,但使用者家目錄不在/home下

awk -f ":" '$6!~/^\/home/&&/bash$/' /etc/passwd
3 抓取eth0的網絡卡ip

ifconfig eth0 | awk -f "" '/inet\>/'
4 統計在系統中可以登入系統的使用者

awk -f ":" '$5!~/^\/home/&&/bash/' /etc/passwd
5 統計檔案的行數

awk 'beginend' /etc/passwd

shell文字處理

最於檔案的操作以前都是用高階程式語言來操作的。今天恰好需要將乙個目錄中的檔案資訊儲存到sqlite3資料庫中 我用linux中的工具和shell來作為自己畢業設計做原型開發 下面記錄一下這裡用到的部分知識,以作備忘。用ls命令來說明 1.關於shell中的管道和重定向問題。這個知識基礎,這裡不再說了...

shell 文字處理

最近優化指令碼,將幾套指令碼合併,比如,處理nand手機的指令碼和處理emmc手機的指令碼是不一樣的,這導致我們的指令碼有很多個版本。手機側只有busybox,所以不能使用功能強大的python來處理文字。花了半天時間,發現雖然語法比較怪異,但也能簡潔的完成任務。if e proc emmc the...

shell之文字處理 echo

echo options string option 表示命令選項,只有 n,表示不輸出行尾的換行符。如果要輸出的文字是由多個單子組成的,使用雙引號括起來。echo n what is your first name?要使用 echo 命令支援轉義字元,要使用 e選項。b 退格符 echo e th...