shell編程之文本小工具

1、文本處理工具
一、grep工具
二、cut工具
三、sort工具
四、uniq工具
五、tee工具
六、diff工具
七、paste工具
2、bash的特性
一、命令和文件自動補全
2 、經常使用的通配符
三、bash中的引號前端

1、文本處理工具

1. grep工具

grep是==行==過濾工具;用於根據關鍵字進行行過濾git

語法和選項

語法:shell

# grep [選項] '關鍵字' 文件名

常見選項:vim

OPTIONS:
    -i: 不區分大小寫
    -v: 查找不包含指定內容的行,反向選擇
    -w: 按單詞搜索
    -o: 打印匹配關鍵字
    -c: 統計匹配到的行數
    -n: 顯示行號
    -r: 逐層遍歷目錄查找
    -A: 顯示匹配行及後面多少行 
    -B: 顯示匹配行及前面多少行
    -C: 顯示匹配行先後多少行
    -l:只列出匹配的文件名
    -L:列出不匹配的文件名
    -e: 使用正則匹配
    -E:使用擴展正則匹配
    ^key:以關鍵字開頭
    key$:以關鍵字結尾
    ^$:匹配空行
    --color=auto :能夠將找到的關鍵詞部分加上顏色的顯示

顏色顯示(別名設置):後端

臨時設置:
# alias grep='grep --color=auto'            //只針對當前終端和當前用戶生效

永久設置:
1)全局(針對全部用戶生效)
vim /etc/bashrc
alias grep='grep --color=auto'
source /etc/bashrc

2)局部(針對具體的某個用戶)
vim ~/.bashrc
alias grep='grep --color=auto'
source ~/.bashrc

舉例說明:bash

==說明:不要直接使用/etc/passwd文件,將其拷貝到/tmp下作實驗!==ide

# grep -i root passwd                       忽略大小寫匹配包含root的行
# grep -w ftp passwd                        精確匹配ftp單詞
# grep -w hello passwd                      精確匹配hello單詞;本身添加包含hello的行到文件
# grep -wo ftp passwd                       打印匹配到的關鍵字ftp
# grep -n root passwd                       打印匹配到root關鍵字的行好
# grep -ni root passwd                      忽略大小寫匹配統計包含關鍵字root的行
# grep -nic root passwd                     忽略大小寫匹配統計包含關鍵字root的行數
# grep -i ^root passwd                      忽略大小寫匹配以root開頭的行
# grep bash$ passwd                             匹配以bash結尾的行
# grep -n ^$ passwd                             匹配空行並打印行號
# grep ^# /etc/vsftpd/vsftpd.conf       匹配以#號開頭的行
# grep -v ^# /etc/vsftpd/vsftpd.conf    匹配不以#號開頭的行
# grep -A 5 mail passwd                     匹配包含mail關鍵字及其後5行
# grep -B 5 mail passwd                     匹配包含mail關鍵字及其前5行
# grep -C 5 mail passwd                     匹配包含mail關鍵字及其先後5行

2. cut工具

cut是==列==截取工具,用於列的截取工具

語法和選項

語法:測試

# cut 選項  文件名

常見選項:ui

-c: 以字符爲單位進行分割,截取
-d: 自定義分隔符,默認爲製表符\t
-f: 與-d一塊兒使用,指定截取哪一個區域

舉例說明:

# cut -d: -f1 1.txt             以:冒號分割,截取第1列內容
# cut -d: -f1,6,7 1.txt     以:冒號分割,截取第1,6,7列內容
# cut -c4 1.txt                 截取文件中每行第4個字符
# cut -c1-4 1.txt           截取文件中每行的1-4個字符
# cut -c4-10 1.txt          截取文件中每行的4-10個字符
# cut -c5- 1.txt                從第5個字符開始截取後面全部字符

3. sort工具

sort工具用於排序;它將文件的每一行做爲一個單位,從首字符向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。

語法和選項

-u :去除重複行
-r :降序排列,默認是升序
-o : 將排序結果輸出到文件中,相似重定向符號>
-n :以數字排序,默認是按字符排序
-t :分隔符
-k :第N列
-b :忽略前導空格。
-R :隨機排序,每次運行的結果均不一樣

舉例說明

# sort -n -t: -k3 1.txt             按照用戶的uid進行升序排列
# sort -nr -t: -k3 1.txt            按照用戶的uid進行降序排列
# sort -n 2.txt                         按照數字排序
# sort -nu 2.txt                        按照數字排序而且去重
# sort -nr 2.txt 
# sort -nru 2.txt 
# sort -nru 2.txt 
# sort -n 2.txt -o 3.txt            按照數字排序並將結果重定向到文件
# sort -R 2.txt 
# sort -u 2.txt

4.uniq工具

uniq用於去除==連續====重複==

常見選項:
-i: 忽略大小寫
-c: 統計重複行次數
-d:只顯示重複行

舉例說明:
# uniq 2.txt 
# uniq -d 2.txt 
# uniq -dc 2.txt

5.tee工具

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

選項:
-a 雙向追加劇定向

# echo hello world
# echo hello world|tee file1
# cat file1 
# echo 999|tee -a file1
# cat file1

6.diff工具

diff工具用於逐行比較文件的不一樣

注意:diff描述兩個文件不一樣的方式是告訴咱們==怎樣改變第一個==文件以後==與第二個文件匹配==。

語法和選項

語法:

diff [選項] 文件1 文件2

經常使用選項:

選項 含義 備註
-b 不檢查空格
-B 不檢查空白行
-i 不檢查大小寫
-w 忽略全部的空格
--normal 正常格式顯示(默認)
-c 上下文格式顯示
-u 合併格式顯示

舉例說明:

  • 比較兩個==普通文件==異同,文件準備:
[root@MissHou ~]# cat file1
aaaa
111
hello world
222
333
bbb
[root@MissHou ~]#
[root@MissHou ~]# cat file2
aaa
hello
111
222
bbb
333
world

1)正常顯示

diff目的:file1如何改變才能和file2匹配
[root@MissHou ~]# diff file1 file2
1c1,2                   第一個文件的第1行須要改變(c=change)才能和第二個文件的第1到2行匹配         
< aaaa              小於號"<"表示左邊文件(file1)文件內容
---                 ---表示分隔符
> aaa                   大於號">"表示右邊文件(file2)文件內容
> hello
3d3                 第一個文件的第3行刪除(d=delete)後才能和第二個文件的第3行匹配
< hello world
5d4                 第一個文件的第5行刪除後才能和第二個文件的第4行匹配
< 333
6a6,7                   第一個文件的第6行增長(a=add)內容後才能和第二個文件的第6到7行匹配
> 333                   須要增長的內容在第二個文件裏是333和world
> world

2)上下文格式顯示

[root@MissHou ~]# diff -c file1 file2
前兩行主要列出須要比較的文件名和文件的時間戳;文件名前面的符號***表示file1,---表示file2
*** file1       2019-04-16 16:26:05.748650262 +0800
--- file2       2019-04-16 16:26:30.470646030 +0800
*************** 我是分隔符
*** 1,6 ****        以***開頭表示file1文件,1,6表示1到6行
! aaaa              !表示該行須要修改才與第二個文件匹配
  111
- hello world       -表示須要刪除該行才與第二個文件匹配
  222
- 333                   -表示須要刪除該行才與第二個文件匹配
  bbb
--- 1,7 ----        以---開頭表示file2文件,1,7表示1到7行
! aaa                   表示第一個文件須要修改才與第二個文件匹配
! hello             表示第一個文件須要修改才與第二個文件匹配
  111
  222
  bbb
+ 333                   表示第一個文件須要加上該行才與第二個文件匹配
+ world             表示第一個文件須要加上該行才與第二個文件匹配

3)合併格式顯示

[root@MissHou ~]# diff -u file1 file2
前兩行主要列出須要比較的文件名和文件的時間戳;文件名前面的符號---表示file1,+++表示file2
--- file1       2019-04-16 16:26:05.748650262 +0800
+++ file2       2019-04-16 16:26:30.470646030 +0800
@@ -1,6 +1,7 @@
-aaaa
+aaa
+hello
 111
-hello world
 222
-333
 bbb
+333
+world
  • 比較兩個==目錄不一樣==
默認狀況下也會比較兩個目錄裏相同文件的內容
[root@MissHou  tmp]# diff dir1 dir2
diff dir1/file1 dir2/file1
0a1
> hello
Only in dir1: file3
Only in dir2: test1
若是隻須要比較兩個目錄裏文件的不一樣,不須要進一步比較文件內容,須要加-q選項
[root@MissHou  tmp]# diff -q dir1 dir2
Files dir1/file1 and dir2/file1 differ
Only in dir1: file3
Only in dir2: test1

其餘小技巧:

有時候咱們須要以一個文件爲標準,去修改其餘文件,而且修改的地方較多時,咱們能夠經過打補丁的方式完成。

1)先找出文件不一樣,而後輸出到一個文件
[root@MissHou ~]# diff -uN file1 file2 > file.patch
-u:上下文模式
-N:將不存在的文件看成空文件
2)將不一樣內容打補丁到文件
[root@MissHou ~]# patch file1 file.patch
patching file file1
3)測試驗證
[root@MissHou ~]# diff file1 file2
[root@MissHou ~]#

7. paste工具

paste工具用於合併文件行

經常使用選項:
-d:自定義間隔符,默認是tab
-s:串行處理,非並行

##8. tr工具

tr用於字符轉換,替換和刪除;主要用於==刪除文件中控制字符==或進行==字符轉換==

語法和選項

語法:

用法1:命令的執行結果交給tr處理,其中string1用於查詢,string2用於轉換處理
# commands|tr  'string1'  'string2'
用法2:tr處理的內容來自文件,記住要使用"<"標準輸入
# tr  'string1'  'string2' < filename

用法3:匹配string1進行相應操做,如刪除操做
# tr options 'string1' < filename

經常使用選項:

-d 刪除字符串1中全部輸入字符。
-s 刪除全部重複出現字符序列,只保留第一個;即將重複出現字符串壓縮爲一個字符串

常匹配字符串:

字符串 含義 備註
==a-z==或[:lower:] 匹配全部小寫字母 [a-zA-Z0-9]
==A-Z==或[:upper:] 匹配全部大寫字母
==0-9==或[:digit:] 匹配全部數字
[:alnum:] 匹配全部字母和數字
[:alpha:] 匹配全部字母
[:blank:] 全部水平空白
[:punct:] 匹配全部標點符號
[:space:] 全部水平或垂直的空格
[:cntrl:] 全部控制字符 \f Ctrl-L 走行換頁<br/>\n Ctrl-J 換行

\r Ctrl-M 回車
\t Ctrl-I tab鍵 |

舉例說明:

[root@MissHou  shell01]# cat 3.txt  本身建立該文件用於測試
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
boss02:x:516:511::/home/boss02:/bin/bash
vip:x:517:517::/home/vip:/bin/bash
stu1:x:518:518::/home/stu1:/bin/bash
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
aaaaaaaaaaaaaaaaaaaa
bbbbbb111111122222222222233333333cccccccc
hello world 888
666
777
999

# tr -d '[:/]' < 3.txt              刪除文件中的:和/
# cat 3.txt |tr -d '[:/]'           刪除文件中的:和/
# tr '[0-9]' '@' < 3.txt            將文件中的數字替換爲@符號
# tr '[a-z]' '[A-Z]' < 3.txt        將文件中的小寫字母替換成大寫字母
# tr -s '[a-z]' < 3.txt             匹配小寫字母並將重複的壓縮爲一個
# tr -s '[a-z0-9]' < 3.txt      匹配小寫字母和數字並將重複的壓縮爲一個
# tr -d '[:digit:]' < 3.txt         刪除文件中的數字
# tr -d '[:blank:]' < 3.txt         刪除水平空白
# tr -d '[:space:]' < 3.txt         刪除全部水平和垂直空白

小試牛刀

  1. 使用小工具分別截取當前主機IP;截取NETMASK;截取廣播地址;截取MAC地址
# ifconfig eth0|grep 'Bcast'|tr -d '[a-zA-Z ]'|cut -d: -f2,3,4
10.1.1.1:10.1.1.255:255.255.255.0
# ifconfig eth0|grep 'Bcast'|tr -d '[a-zA-Z ]'|cut -d: -f2,3,4|tr ':' '\n'
10.1.1.1
10.1.1.255
255.255.255.0
# ifconfig eth0|grep 'HWaddr'|cut -d: -f2-|cut -d' ' -f4
00:0C:29:25:AE:54
# ifconfig eth0|grep 'HW'|tr -s ' '|cut -d' ' -f5
00:0C:29:B4:9E:4E

# ifconfig eth1|grep Bcast|cut -d: -f2|cut -d' ' -f1
# ifconfig eth1|grep Bcast|cut -d: -f2|tr -d '[ a-zA-Z]'
# ifconfig eth1|grep Bcast|tr -d '[:a-zA-Z]'|tr ' ' '@'|tr -s '@'|tr '@' '\n'|grep -v ^$
# ifconfig eth0|grep 'Bcast'|tr -d [:alpha:]|tr '[ :]' '\n'|grep -v ^$
# ifconfig eth1|grep HWaddr|cut -d ' ' -f11
# ifconfig eth0|grep HWaddr|tr -s ' '|cut -d' ' -f5
# ifconfig eth1|grep HWaddr|tr -s ' '|cut -d' ' -f5
# ifconfig eth0|grep 'Bcast'|tr -d 'a-zA-Z:'|tr ' ' '\n'|grep -v '^$'
  1. 將系統中全部普通用戶的用戶名、密碼和默認shell保存到一個文件中,要求用戶名密碼和默認shell之間用tab鍵分割
# grep 'bash$' passwd |grep -v 'root'|cut -d: -f1,2,7|tr ':' '\t' |tee abc.txt

2、bash的特性

一、命令和文件自動補全

Tab只能補全==命令和文件== (RHEL6/Centos6)

##二、常見的快捷鍵

^c              終止前臺運行的程序
^z              將前臺運行的程序掛起到後臺
^d              退出 等價exit
^l              清屏 
^a |home    光標移到命令行的最前端
^e |end     光標移到命令行的後端
^u              刪除光標前全部字符
^k              刪除光標後全部字符
^r              搜索歷史命令

2 、經常使用的通配符

*:  匹配0或多個任意字符
?:  匹配任意單個字符
[list]: 匹配[list]中的任意單個字符,或者一組單個字符   [a-z]
[!list]: 匹配除list中的任意單個字符
{string1,string2,...}:匹配string1,string2或更多字符串

# rm -f file*
# cp *.conf  /dir1
# touch file{1..5}

三、bash中的引號

  • 雙引號"" :會把引號的內容當成總體來看待,容許經過$符號引用其餘變量值
  • 單引號'' :會把引號的內容當成總體來看待,禁止引用其餘變量值,shell中特殊符號都被視爲普通字符
  • 反撇號`` :反撇號和$()同樣,引號或括號裏的命令會優先執行,若是存在嵌套,反撇號不能用
[root@MissHou  dir1]# echo "$(hostname)"
server
[root@MissHou  dir1]# echo '$(hostname)'
$(hostname)
[root@MissHou  dir1]# echo "hello world"
hello world
[root@MissHou  dir1]# echo 'hello world'
hello world

[root@MissHou  dir1]# echo $(date +%F)
2018-11-22
[root@MissHou  dir1]# echo `echo $(date +%F)`
2018-11-22
[root@MissHou  dir1]# echo `date +%F`
2018-11-22
[root@MissHou  dir1]# echo `echo `date +%F``
date +%F
[root@MissHou  dir1]# echo $(echo `date +%F`)
2018-11-22

————————————本文到此結束,感謝閱讀————————————

相關文章
相關標籤/搜索