SHELL編程(一):小工具合集

下面是小凰凰的簡介,看下吧!
💗人生態度:珍惜時間,渴望學習,熱愛音樂,把握命運,享受生活
💗學習技能:網絡 -> 雲計算運維 -> python全棧( 當前正在學習中)
💗您的點贊、收藏、關注是對博主創作的最大鼓勵,在此謝過!
有相關技能問題可以寫在下方評論區,我們一起學習,一起進步。
後期會不斷更新python全棧學習筆記,秉着質量博文爲原則,寫好每一篇博文。

一、文本處理工具

1. grep工具

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

我們可能看到別人不光使用grep,還有egrep、fgrep等擴展工具,目前Linux操作系統默認都是使用GNU版本的grep,它功能更加強大,它支持用-E或-F參數去使用egrep或fgrep。所以這裏我們主要講解grep工具。

語法和選項

語法:

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

常見選項:

OPTIONS:
    -i: 不區分大小寫
    -v: 查找不包含指定內容的行,反向選擇
    -w: 按單詞搜索
    -o: 打印匹配關鍵字
    -c: 統計匹配到的行數
    -n: 顯示行號
    -r: 逐層遍歷目錄查找
    -A: 顯示匹配行及後面多少行	
    -B: 顯示匹配行及前面多少行
    -C: 顯示匹配行前後多少行
    -l:只列出匹配的文件名
    -L:列出不匹配的文件名
    -e: 使用正則匹配
    -E:使用擴展正則匹配
    ^key:以關鍵字開頭
    key$:以關鍵字結尾
    ^$:匹配空行
    --color=auto :可以將找到的關鍵詞部分加上顏色的顯示
學習Grep時,需要了解通配符、正則表達式兩個概念,很多讀者容易把彼此搞混淆,通配符
主要用在Linux的Shell命令中,常用於文件或者文件名稱的操作,而正則表達式用於文本內容中
的字符串搜索和替換,常用在AWK、GREP、SED、VIM工具中對文本的操作。

通配符類型詳解:

*						0個或者多個字符、數字;
?						匹配任意一個字符;
#						表示註解;
|						管道符號;
;						多個命令連續執行;
&						後臺運行指令;
!						邏輯運算非;
[ ]						內容範圍,匹配括號中內容;
{ }						命令塊,多個命令匹配。

正則表達式詳解:

*						前一個字符匹配0次或多次;
.						匹配除了換行符以外任意一個字符;
.*						代表任意字符;
^						匹配行首,即以某個字符開頭;
$						匹配行尾,即以某個字符結尾;
(..) 					標記匹配字符;
[]						匹配中括號裏的任意指定字符,但只匹配一個字符;
[^]						匹配除中括號以外的任意一個字符;
\						轉義符,取消特殊含義;
\< 						錨定單詞的開始;
\> 						錨定單詞的結束;
{n}						匹配字符出現n次;
{n,}					匹配字符出現大於等於n次;
{n,m}					匹配字符至少出現n次,最多出現m次;
\w 						匹配文字和數字字符,不匹配符號;
\W 						\w的反置形式,匹配一個或多個非單詞字符,匹配符號;
\b 						單詞鎖定符;
\s						匹配任何空白字符;
\d						匹配一個數字字符,等價於[0-9]//sed工具的正則與grep工具的正則有2個不一樣,是{}和(),sed中應該是\{..\}和\(..\) .

實戰演練:

grep  -c "test" 	     haha.txt	 統計test字符總行數;
grep  -i "TEST" 	     haha.txt	 不區分大小寫查找TEST所有的行;
grep  -n "test" 	     haha.txt	 打印test的行及行號;
grep  -v "test" 	     haha.txt	 不打印test的行;
grep  "test[53]" 	     haha.txt	 以字符test開頭,接5或者3的行;
grep  "^[^test]" 	     haha.txt	 顯示輸出行首不是test的行;
grep  "[Mm]ay" 	 		 haha.txt	 匹配M或m開頭的行;
grep  "K…D" 		 	 haha.txt	 匹配K,三個任意字符,緊接D的行;
grep  "[A-Z][9]D"  		 haha.txt	 匹配大寫字母,緊跟9D的字符行;
grep  "T{2,}" 	     haha.txt	 打印字符T字符連續出現2次以上的行;
grep  "T{4,6}" 	     haha.txt	 打印字符T字符連續出現4次及6次的行;
grep  -n "^$" 	 		 haha.txt	 打印空行的所在的行號;
grep  -vE "#|^$"      	 haha.txt    不匹配文件中的#和空行;

grep   --color -ra -E    "db|config|sql"  *  匹配包含db或者config或者sql的文件;
echo 192.168.2.1|egrep "^([0-9]{1,3}\.){3}([0-9]{1,3})$"   匹配IPV4地址。
//注:如果不加^和$,便不能精確匹配IPV4,而且這裏未對ip地址的每一位的範圍做限制。

2. cut工具

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

語法和選項

語法:

# cut 選項  文件名

常見選項:

-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個字符開始截取後面所有字符

課堂練習:
用小工具列出你當系統的運行級別。5/3

  1. 如何查看系統運行級別
    • 命令runlevel
    • 文件/etc/inittab
  2. 如何過濾運行級別
runlevel |cut -c3
runlevel | cut -d ' ' -f2
grep -v '^#' /etc/inittab | cut -d: -f2
grep '^id' /etc/inittab |cut -d: -f2
grep "initdefault:$" /etc/inittab | cut -c4
grep -v ^# /etc/inittab |cut -c4
grep 'id:' /etc/inittab |cut -d: -f2
cut -d':' -f2 /etc/inittab |grep -v ^#
cut -c4 /etc/inittab |tail -1
cut -d: -f2 /etc/inittab |tail -1

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. 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 走行換頁
\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

二、bash的特性

1、命令和文件自動補全

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

2、常見的快捷鍵

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

3 、常用的通配符(重點)

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


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

4、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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章