1. 程式人生 > 其它 >shell指令碼處理工具

shell指令碼處理工具

1、grep工具

grep是行過濾器,根據關鍵字進行行過濾。

grep 【選項】 '關鍵字' 檔名

別名定義顯示顏色

grep --color=auto ‘time’  passwd   :找出具有time的行並把time標紅。 

l臨時:alias grep='grep --color=auto'

永久:vim /etc/bashrc  在檔案的最後面增加一行 alias grep='grep --color=auto'   source /etc/bashrc 重新讀取檔案使其生效。(任何使用者都會生效)

選項

grep -n 'root' passwd :顯示passwd中有root的行並加上行號

grep -ni 'root' passwd :顯示passwd中有root的行並加上行號且忽略大小寫,ROOT也會被顯示出來    -i:忽略大小寫

grep '^root' passwd : 顯示passwd中以root開頭的行

grep 'bash$' passwd : 顯示passwd中以bash結尾的行

grep -v '^root' passwd :顯示passwd中不以root開頭的行    -v :取反的意思

grep -nA  3  '^ftp' passwd :顯示passwd中以ftp開頭那行的後三行,包括ftp那行。A:顯示後幾行

grep -nB 3  '^ftp' passwd :顯示passwd中以ftp開頭那行的前三行,包括ftp那行。B:顯示前幾行

grep -nC  3  '^ftp' passwd :顯示passwd中以ftp開頭那行的前後三行,包括ftp那行。C:顯示前後幾行

grep -w 'hello' passwd :顯示passwd中有單詞hello的那一行,如:hello world  和helloworld ,顯示前者

grep -o 'root' passwd :只顯示關鍵字root。

grep -cn 'root' passwd :顯示passwd中有root的行並加上行號,-c 顯示匹配到的次數

^$ 匹配空行

-r 逐層遍歷目錄查詢

-l 只列出匹配的檔名

-L 只列出不匹配的檔名

-e 使用正則匹配

-E 使用擴充套件正則匹配

2、cut工具

cut是列擷取工具,用於列的擷取

cut 選項 檔名

常見選項:

-c :以字元為單位進行分割,擷取

-d :自定義分隔符,預設為製表符\t(tab鍵)

-f :與-d一起使用,指定擷取那個區域

舉例說明:

cut -d:  -f1 passwd   :以:號為分隔符擷取passwd檔案的第一列(-d:也可以寫成 -d ':' 或  -d ":")

cut -d: -f1,7 passwd |head :以:號為分隔符擷取passwd檔案的第一列和第七列(只顯示前十行)

cut -c1-5 passwd :擷取passwd第一到第五字元的列

cut -c10- passwd :擷取passwd第10個字元以後的列(包括第十個)

cut -c5-10 passwd :擷取passwd第五個到第十個字元的列

sort工具

sort用於排序,將檔案的每一行作為一個單位,從首字元向後,依次按照ASCII碼值進行比較,最後將他們按升序輸出。

-u:去除重複行

-n :以數字排序,預設是按字元排序

-t :分隔符(相當於cut中的-d)

-k :第N列(相當於cut中的-f)

sort -n -t: -k3 passwd   :  以:為分割符 以第三列為準從小到大以數字排列每行,預設為升序

sort -nr -t: -k3 passwd   :  以:為分割符 以第三列為準從大到小以數字排列每行,-r 降序排列

sort -nr -t: -k3 passwd -o 1.txt  :  以:為分割符 以第三列為準從大到小以數字排列每行,把排序資料放入到1.txt檔案裡,-o = > :覆蓋輸入

sort -u 1.txt :去重之後再排序,(去掉重複的行)

sort -Ru 1.txt :去重之後再隨機排序 ,-R:隨機排序

-f :忽略大小寫的差異,例如 A 與 a 視為編碼相同;

-b :忽略最前面的空格符部分

uniq工具

用於去除連續重複行

常見選項

-i :忽略大小寫

-c :統計重複行次數

-d:只顯示重複行

列子:

uniq -c 1.txt :去除連續的重複行,並顯示連續重複的次數

uniq -cd 1.txt :只顯示連續重複的行,並顯示連續重複行 重複的次數

uniq -i 1.txt :忽略大小寫去除連續重複的行

tee工具

tee工具是從標準輸入讀取並寫入到標準輸出和檔案,即:雙向覆蓋重定向 (輸出 | tee 輸入檔案)

選項:

-a :雙向追加重定向

echo 'hello woeld' |tee 1.txt : 把文字輸入到螢幕,並對1.txt進行覆蓋放入

echo '999' |tee -a 1.txt  : 把文字輸入到螢幕,並對1.txt進行追加放入

***grep -v '^#' vsftpd.conf | grep -v '^$' |tee vsftpd.conf.bak(把vsftpd.conf 中的有效行備份到vsftpd.conf.bak)***

diff工具

diff工具用於逐行比較文字的不同

**diff描述兩個檔案不同的方式是告訴我們怎樣改變第一個檔案之後與第二個檔案匹配

diff 【選項】 檔案1 檔案2

-b :不檢查空格字元的不同

-B:不檢查空白行

-i:不檢查大小寫

-w:忽略所有空格

--normal :正常格式顯示(預設)

-c :上下文格式顯示

-u:合併格式顯示

file1

aaaa
111
hello world
222
333
bbb

 

file2

aaa
hello
111
222
bbb
333
world

 

diff file1 file2   --normal :正常格式顯示(預設)

1c1,2           第一個檔案的第一行需要改變(c :改變)才能和第二個檔案的第一到第二行匹配
< aaaa         <小於號表示左邊的檔案內容(file1)
---                 ---表示分隔符
> aaa           大於號>表示右邊的檔案內容(file2)
> hello          

*** 上邊代表把左邊檔案第一行變為aaa 和hello兩行才能與file2匹配

3d3                      d 刪除 把左邊file1的第三行刪除才能與右邊匹配
< hello world


5d4                把file1第五行刪除才能與file2第六行匹配
< 333
6a6,7              a:新增  在file1第六行增加以下兩行內容,才能與file2第六到七行匹配
> 333
> world

diff -c file1 file2    -c :上下文格式顯示

*** file1    2022-04-11 19:04:13.339031376 +0800
--- file2    2022-04-11 19:04:54.756935879 +0800
***************
*** 1,6 ****    表示file1檔案1到6行
! aaaa               !表示改行需要修改才能與第二個檔案匹配
  111
- hello world       -表示需要刪除該行才能與第二個檔案匹配
  222
- 333                 -表示需要刪除該行才能與第二個檔案匹配
  bbb
--- 1,7 ----        表示file2檔案1到7行
! aaa               !表示第一個檔案需要修改才能與第二個檔案匹配
! hello              
  111
  222
  bbb
+ 333               表示第一個檔案需要增加才能與第二個檔案匹配
+ world

diff -u file1 file2     -u:合併格式顯示

--- file1    2022-04-11 19:04:13.339031376 +0800   ---表示file1
+++ file2    2022-04-11 19:04:54.756935879 +0800  +++表示file2 
@@ -1,6 +1,7 @@   -1,6 file1一到六行 +1,7 file2 一到七行
-aaaa                  file1中刪除此行
+aaa                    file1中新增此行
+hello               file1中新增此行
 111
-hello world          file1中刪除此行    
 222
-333                 file1中刪除此行
 bbb
+333                   file1中新增此行
+world               file1中新增此行

diff也可以比較目錄的不同

預設情況下也會比較目錄裡相同檔案的內容

diff  dir1 dir 2 (不只會比較目錄的不同也會比較目錄下相同檔案內容的不同)

選項  -q :只比較目錄

diff -q dir1 dir 2

其他技巧

可以通過打補丁的方式去修改檔案

1、先找出檔案的不同然後輸出到一個檔案

diff -uN file1 file2 > file.patch

-u :上下文模式

-N :像不存在的檔案當作一個空檔案

2、將不同內容打補丁到檔案

patch file1 file.patch

3、驗證

diff file1 file2

paste工具

paste用於合併檔案行 

選項

-d 自定義分隔符  預設為tab    

-s 序列處理,非並行

paste -d: file1 file2   將兩個檔案同一行合併為一行顯示以:為分隔符

file1:file2

file11 :file22

 :file222

paste -s file1 file2   將兩個檔案同一行合併為一列顯示

file1 file11

file2 file22 file222

tr工具

tr用於字元的轉換,替換和刪除;主要用於刪除檔案中控制字元或進行字元轉換

tr 第一字符集 第二字符集

選項:

-c或——complerment:取代所有不屬於第一字符集的字元;

-d或——delete:刪除所有屬於第一字符集的字元;

-s或--squeeze-repeats:把連續重複的字元以單獨一個字元表示;

-t或--truncate-set1:先刪除第一字符集較第二字符集多出的字元。

常匹配字串

[:alnum:]:字母和數字       

 [:alpha:]:字母

[:cntrl:]:控制(非列印)字元

0-9[:digit:]:數字

[:graph:]:圖形字元

a-z[:lower:]:小寫字母

[:print:]:可列印字元

[:punct:]:標點符號

[:space:]:空白字元

A-Z[:upper:]:大寫字母

[:xdigit:]:十六進位制字元

[:blank:]:所有水平空白

例子

tr 'a-z' 'A-Z' <1.txt :把檔案1.txt裡的小寫字母替換為大寫字母

tr '0-9' '@' <1.txt :把檔案1.txt裡的數字替換為@

tr ':/' '#'  1.txt :把1.txt檔案的:和/換成#

tr -d 'a-z' <1.txt :刪除檔案中的小寫字母(要刪啥就往第一字符集里加啥)

echo "thissss is a text linnnnnnne." | tr -s ' sn'  :壓縮連續的s和n

this is a text line.

shell中的萬用字元

常見快捷鍵

ctrl +c 終止某個操作

  z   將前臺執行的程式掛到後臺

  d 退出 等於exit

  1 清屏等於clear

  a 游標移動到命令列最前端

  e 游標移動到命令列最後端

  u 刪除游標前所有字元

  k刪除游標後所有字元

  r 搜尋歷史命令(輸入關鍵字即可)

常用萬用字元

*  :匹配0或多個字元    

? :匹配任意單個字元

[list] :匹配[list]中的任意單個字元或者一組單個字元  file[abc]  匹配filea或fileb或filec, file[1-47] 匹配file1到file4和file7 (-必須後邊的大於前邊的)

[!list] :匹配除[!list]中的任意單個字元 或一組單個字元[!abc]  匹配除filea、fileb、filec 外的任意file加一個字元

{string1,string2,.......} :匹配string1,string2 ,或更多字元  file{1,3..6}(必須要兩個點) 匹配file1和file3 file4 .....file6

例子:有兩個檔案file1 ,file11

ls -l fi*  或者 flile*能匹配到兩個檔案  ls -l file1* 能匹配到file1

但ls -l file1? 匹配不到file1 且 ls -l fil? 匹配不到連個檔案 只有ls -l file? 匹配到file1 ls -l file1?匹配到file11 

bash中的引號

雙引號""  :會把引號內的內容當成整體來看,允許通過$符合引用其他變數值

單引號''  : 會把引號內的內容當成整體來看,禁止引用其他變數值,shell中特殊符號都被視為普通字元

反撇號`` :反撇號和$()一樣,引號或括號裡的命令會優先執行,如果存在巢狀,反撇號不能用

echo "$(date +%F)" = echo "`date +%F`"

echo `echo "`date +%F`"`  這就是巢狀,是不允許的會報錯,可以改為 echo  $(echo "`date +%F`")