天天看點

超全面的正規表達式實戰手冊,運維&程式員趕快收藏!

Linux系統中經常會利用一些特殊的符号字元來表示一些特定含義的内容,便于資料檢索和資料比對。

系統通配符号介紹

1、系統通配符号簡介

通配符号簡單來說,就是鍵盤上的一些特殊符号,可以實作某些特殊的功能。

例如:用來模糊搜尋系統中的檔案,使用通配符号 * 和 ?字元來代替一個或多個真正的實際字元,進而提高檢索效率

利用通配符可以在Linux指令行或bash腳本中輕松比對或查找所需的檔案,以提高工作效率。

通配符也是bash的内置功能,幾乎适用于所有的Linux環境,常用的通配符号如下:

序号 符号 解釋說明
01 * 比對任意(0個或多個)字元或字元串,包括空字元串
02 比對任意1個字元,有且隻有一個字元
03 [abcd] 比對abcd中任何一個字元,abcd也可是其他任意不連續字元
04 [a-z] 比對a到z之間的任意一個字元,字元前後要連續,也可以用連續數字,即[1-9]
05 [!abcd] 表示不比對括号裡面的任何一個字元,也可寫為[!a-d],這裡的!号可以用^替代,即adbcd
06 {} 表示用于生成字元序列資訊以及組合序列,結合$符号使用可以用于識别變量資訊

2、系統通配符号詳述

01. *号的作用詳述與實踐

在Linux指令行通配符中,*号的意思是比對所有(0到多個)字元;

在查找某一類檔案時特别友善,在指令行中是十分常用的符号。

實踐操作:

環境準備:

tiki wiki
[xiaoQ@ ~]$ mkdir test
[xiaoQ@ ~]$ cd test
[xiaoQ@ test]$ touch xiaoQ.txt xiaoT.txt test.txt
[xiaoQ@ test]$ touch xiaoC.sh
[xiaoQ@ test]$ ls
test.txt  xiaoC.sh  xiaoQ.txt  xiaoT.txt
-- 3個txt結尾的檔案,1個sh結尾的檔案      

實踐情況-01:檢視所有結尾為txt的檔案

tiki wiki
[xiaoQ@ test]$ ls *.txt
test.txt  xiaoQ.txt  xiaoT.txt
-- 星号可以用于比對任意開頭資訊,以指定資訊結尾的檔案      

實踐情況-02:檢視所有結尾為sh的檔案

tiki wiki
[xiaoQ@ test]$ ls *.sh
xiaoC.sh
-- 星号可以用于比對任意開頭資訊,以指定資訊結尾的檔案      

實踐情況-03:檢視所有開頭為xiao的檔案

tiki wiki
[xiaoQ@ test]$ ls xiao*
xiaoC.sh  xiaoQ.txt  xiaoT.txt
-- 星号可以用于比對任意結尾資訊,以指定資訊開頭的檔案      

實踐情況-04:檢視所有中間為iao的檔案

tiki wiki
[xiaoQ@ test]$ ls *iao*
xiaoC.sh  xiaoQ.txt  xiaoT.txt
-- 星号可以用于比對任意字元資訊,以含有指定字元資訊的檔案      

實踐情況-05:檢視所有隐藏檔案和含有空格的檔案

tiki wiki
# 查找指定隐藏檔案資訊
[xiaoQ@ test]$ touch .xiaoA .xiaoB 
[xiaoQ@ test]$ ls ./.*
./.xiaoA  ./.xiaoB

./.:
test.txt  xiaoC.sh  xiaoQ.txt  xiaoT.txt

./..:
readme  test
[xiaoQ@ test]$ ls ./.x*
./.xiaoA  ./.xiaoB

# 查找含有空格字元檔案
[xiaoQ@ test]$ touch 'xiao X.txt' 
[xiaoQ@ test]$ ls xiao*X.txt
xiao X.txt      

02. ?号的作用詳述與實踐

在Linux指令行通配符中,?号代表的是任意一個字元(有且隻有一個),這個字元在實際工作中運用不多。

實踐操作:

實踐情況-01:檢視所有結尾為.sh的檔案

[xiaoQ@ test]$ ls
test.txt  xiaoC.sh  xiaoQ.txt  xiaoT.txt  xiao X.txt
[xiaoQ@ test]$ ls ?.sh
ls: cannot access ?.sh: No such file or directory
[xiaoQ@ test]$ touch a.sh b.sh c.sh
[xiaoQ@ test]$ ls ?.sh
a.sh  b.sh  c.sh
[xiaoQ@ test]$ ls ?????.sh
xiaoC.sh      

03. [abcd]的作用詳述與實踐

在Linux指令行通配符中 [] 這個符号裡面可以加abcd等0到多個字元,表示比對abcd的任意一個字元中有且隻有一個

實踐操作:

實踐情況-01:檢視所有結尾為.sh的檔案

[xiaoQ@ test]$ ls ?.sh
a.sh  b.sh  c.sh
[xiaoQ@ test]$ ls [abcd].sh
-- 比對 .sh結尾的,且前面必須包含a b c d四個字元中的任意一個
a.sh  b.sh  c.sh
[xiaoQ@ test]$ touch ab.sh
[xiaoQ@ test]$ ls [abcd].sh
a.sh  b.sh  c.sh
-- ab表示兩個字元,并不會被中括号中的内容比對
[xiaoQ@ test]$ ls xi[abcd]oC.sh
xiaoC.sh
-- 比對oC.sh結尾,開頭是xi,之後是a b c d中的任意一個      

04. [a-z] 的作用詳述與實踐

[]這個符号裡面的a-z,表示比對a到z的任意一個字元(有且隻有一個),a-z要表示連續,也可以連續數字資訊

例如:[1-9]表示的就是比對1到9中的任意一個字元

實踐操作:

實踐情況-01:檢視所有結尾為.sh的檔案

[xiaoQ@ test]$ ls *.sh
ab.sh  a.sh  b.sh  c.sh  xiaoC.sh
[xiaoQ@ test]$ ls [a-z].sh
-- 比對 .sh結尾,前面值包含a-z之間的任意一個字元
a.sh  b.sh  c.sh
[xiaoQ@ test]$ ls [a-z]?.sh
-- 比對a到z之間包含的任意一個字元開頭,後面任意1個字元,最後以.sh結尾的檔案
ab.sh
[xiaoQ@ test]$ ls [a-z]????.sh
xiaoC.sh
-- 比對a到z之間包含的任意一個字元開頭,後面任意4個字元,最後以.sh結尾的檔案
[xiaoQ@ test]$ touch 1 2
[xiaoQ@ test]$ ls [1-9]
-- 比對1到9之間的任意一個數字
1  2      

05. [!abcd] 的作用詳述與實踐

[!abcd]表示比對除了abcd四個字元以外的任意一個字元(有且隻有一個),也可寫成abcd或a-d

實踐操作:

實踐情況-01:查找非abcd的單個字元的檔案

[xiaoQ@ test]$ touch a b c d e f
[xiaoQ@ test]$ ls ?
1  2  a  b  c  d  e  f
[xiaoQ@ test]$ ls [!abcd]
-- 比對包含a b c d任意字元以外的單個字元檔案
1  2  e  f
[xiaoQ@ test]$ ls [^abcd]
-- 比對包含a b c d任意字元以外的單個字元檔案
1  2  e  f
[xiaoQ@ test]$ ls [^a-d]
-- 比對包含a b c d任意字元以外的單個字元檔案
1  2  e  f
[xiaoQ@ test]$ ls [^1-9]
-- 比對包含1到9任意字元以外的單個字元檔案
a  b  c  d  e  f      

綜合練習:

練習-01:查找/etc/目錄包含hosts字元串的所有檔案

[root@ ~]# find /etc/ -type f -name "*hosts*"
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny      

練習-02:查找/etc目錄下的所有檔案,檔案名的第一個字元為任意字元,第二字元為o p q中的任意一個,第三個字元不能在a到r之間,結尾是ts

[root@ ~]# find /etc/ -type f -name "?[opq][^a-r]ts"
/etc/hosts      

06. {}的作用詳述與實踐

{}在系統中可以用于生成預設字母或數值序列,還可以實作序列資訊的組合,以及可以實作加載變量資訊

實踐操作:

實踐情況-01:利用{}生成字元序列資訊

# 連續序列
[root@ ~]# echo {1..9}
1 2 3 4 5 6 7 8 9
[root@ ~]# echo {a..k}
a b c d e f g h i j k

# 間隔序列
[root@ ~]# echo {1..9..2}
1 3 5 7 9
[root@ ~]# echo {a..k..2}
a c e g i k
[root@ ~]# echo {a,f,1,3}
a f 1 3      

實踐情況-02:利用{}實作字元資訊組合

[root@ ~]# echo {1,2}{a,b}
1a 1b 2a 2b
[root@ ~]# echo 1{a,b}
1a 1b
[root@ ~]# echo {1,2}a
1a 2a

# 利用序列組合可以實作資料快速備份
[root@ ~]# touch /etc/sysconfig/xiaoQ.conf
[root@ ~]# cp /etc/sysconfig/xiaoQ.conf{,.bak}

# 利用序列組合可以實作資料快速還原
[root@ ~]# mv /etc/sysconfig/xiaoQ.conf{.bak,}
mv: overwrite ‘/etc/sysconfig/xiaoQ.conf’? y      

實踐情況-03:将變量括起來作為變量的分割符

[root@ ~]# num=6
[root@ ~]# echo $num
6
[root@ ~]# echo $num_info
-- 輸出為空,系統将num_info作為變量了

[root@ ~]# echo ${num}_info
-- 将變量num括起來單獨作為變量,後邊_info當成正常字元資訊,即可實作資訊輸出
6_info      

系統特殊符号介紹

1、系統特殊符号簡介

相比通配符号來說,Linux特殊符号更加複雜多樣,且雜亂無章;是以,為了初學者便于記憶掌握,做了一定分類

  • 系統基礎類型特殊符号:; # | $
  • 引号類型相關特殊符号:'' "" `` 無引号
  • 重定向類型的特殊符号:> >> < << 及特殊情況
  • 切換路徑相關特殊符号:~ - . ..
  • 判斷邏輯相關特殊符号:&& || !

01.系統基礎特殊符号

序号 符号 解釋說明
01 ; 表示一個指令的結束,也是指令間的分隔符
02 # 表示注釋内容,是用來給管理者看的,系統不會執行以#好開頭的内容 root使用者的指令提示符
03 | 表示管道符号,将一個指令處理後的結果内容輸出給下一個指令繼續處理
04 $ 字元串前加$符号,代表字元串變量内容 代表普通使用者的指令提示符

分号的介紹與實踐

在Linux指令行中,分号表示一個指令的結束,也是指令間的分隔符;

在有些配置檔案中,以分号開頭的内容代表注釋,例如在keepalived.conf高可用配置中就是如此:

實踐操作作用示範:

[root@ ~]# ll /test -d
ls: cannot access /test: No such file or directory
[root@ ~]# mkdir /test ; cd /test ; pwd
-- 同時執行多個指令:建立指定目錄,進入指定目錄,并檢視所在路徑
/test
[root@ test]# ll /test/ -d
drwxr-xr-x 2 root root 6 Jan 12 21:39 /test/      

井号的介紹與實踐

在Linux系統的配置檔案中,經常會看到以井号開頭的内容,表示後面的注釋内容,這部分内容是管理者看的;

系統不會執行以井号開頭的内容。

實踐操作作用示範:

# 正常編寫腳本檔案,并觸發執行腳本檔案
[root@ ~]# cat test_#.sh 
echo xiaoQ linux
echo xiaoQ python
echo xiaoQ network
[root@ ~]# sh test_#.sh 
xiaoQ linux
xiaoQ python
xiaoQ network

# 将腳本檔案指定内容加井号注釋,再執行腳本檔案
[root@ ~]# cat test_#.sh 
echo xiaoQ linux
# echo xiaoQ python
#echo xiaoQ network
[root@ ~]# sh test_#.sh 
xiaoQ linux
-- 執行沒有井号開頭的行會被系統識别      

系統中除了腳本檔案或代碼檔案中會用到井号作為注釋資訊,一些配置檔案也會使用井号作為注釋資訊:

[root@xiaoq ~]# tail /etc/ssh/sshd_config 
# override default of no subsystems
Subsystem sftp  /usr/libexec/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server      

管道符的介紹與實踐

在Linux系統指令行中,管道符是極其重要的符号,類似于生活中的管道作用,隻不過Linux管道裡傳輸的是資料流;

在實際指令行中,指令處理後在并未得到想要的結果前,可以将資料交給其他指令繼續處理,直到得到最終結果為止

一般在指令和指令之間就需要用管道銜接将資料流發過來進行處理。

實踐操作作用示範:

[root@xiaoq ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.101  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::d349:f92:2e8e:dc7e  prefixlen 64  scopeid 0x20<link>                 ::
        ether 00:0c:29:19:74:65  txqueuelen 1000  (Ethernet)
        RX packets 1043  bytes 95395 (93.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 882  bytes 110951 (108.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@xiaoq ~]# ifconfig eth0|grep 10.0.0
        inet 10.0.0.101  netmask 255.255.255.0  broadcast 10.0.0.255      

美元符的介紹與實踐

在Linux系統指令行或shell腳本程式中,在字元串前加$符号,代表的是字元串變量的内容。

實踐操作作用示範:

[root@xiaoq ~]# echo $OLDPWD
/test
[root@xiaoq ~]# echo $PWD
/root
[root@xiaoq ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaoq ~]# xiaoQ=1
[root@xiaoq ~]# echo $xiaoQ
1      

02.引号類型特殊符号

序号 符号 解釋說明
01 單引号 '' 所見即所得,即輸入單引号内容時會将單引号内的所有内容都原樣輸出; 或者描述為單引号裡面看到的是什麼就會輸出什麼,稱為強引用
02 雙引号 "" 輸出雙引号内的所有内容時,如果内容中有變量、特殊字元等資訊; 會将變量、特殊字元等資訊解析出結果,然後在輸出,稱為弱引用
03 無引号 基本和有雙引号的作用功能一緻;隻是在有空格字元存在時,需要使用雙引号; 當需要生成序列資訊時,需要使用無引号情況
04 反引号 一般用于引用指令,執行的時候指令會被執行,相當于"$()" 指派和輸出都要将指令用反引号引起來

單引号的介紹與實踐

簡單來說,當待處理的内容用單引号引起來時,引号裡面有什麼内容,處理時就一直保持引号之前的内容不變。

實踐操作作用示範:

[root@xiaoq ~]# echo '$PATH'
$PATH
[root@xiaoq ~]# echo '`date`'
`date`      

雙引号的介紹與實踐

當輸出雙引号内的所有内容時,會先将變量或特殊字元解釋出來,然後輸出最終的内容;

若在平時引用字元串時,不知如何應用引号符号,則可預設使用雙引号。

實踐操作作用示範:

[root@xiaoq ~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaoq ~]# echo "`date`"
Thu Dec 12 00:00:07 CST 2222
[root@xiaoq ~]# echo "xiaoQ"
xiaoQ      

無引号的介紹與實踐

不使用引号的功能與雙引号類似,但由于沒有引号,在引用字元串資訊時,很難确定字元串的邊界;

是以很容易出現各種未知的操作錯誤,是以建議處理字元串内容是建議使用雙引号替代不加引号情況

實踐操作作用示範:

[root@xiaoq ~]# echo "dir info $PWD"
dir info /root
[root@xiaoq ~]# echo dir info $PWD
dir info /root
-- 輸出加載指定資訊,無引号和雙引号功能類似
[root@xiaoq ~]# xiaoQ=linux 123
-bash: 123: command not found
[root@xiaoq ~]# xiaoQ="linux 123"
-- 變量指派時,字元串中有空格出現無引号情況無法确認邊界情況,會指派報錯
[root@xiaoq ~]# echo {1..5}
1 2 3 4 5
[root@xiaoq ~]# echo "{1..5}"
{1..5}
-- 加載{}生成序列資訊時,是不需要使用雙引号的      

反引号的介紹與實踐

簡單來說,當将帶處理的字元串用反引号引起來的時候,系統會先将反引号裡字元串當做指令進行解析識别;

然後針對解析後的結果做進一步的處理。反引号一般用于引用指令,執行的時候指令會被執行,等價于$()。

實踐操作作用示範:

[root@xiaoq ~]# date
Thu Dec 12 00:00:21 CST 2222
[root@xiaoq ~]# echo date
date
[root@xiaoq ~]# echo `date`
Thu Dec 12 00:00:40 CST 2222
-- 可以識别解析指令資訊
[root@xiaoq ~]# echo `aa`
-bash: aa: command not found
-- 反引号中隻能解析識别有效的指令
[root@xiaoq ~]# host_info=`hostname`
[root@xiaoq ~]# echo $host_info 
xiaoq.edu
-- 做指派操作時,也可以使用反引号解析指令後的結果再指派
[root@xiaoq ~]# cp /etc/hosts /data/hosts-`date +%F`
[root@xiaoq ~]# ll /data/hosts-`date +%F`
-rw-r--r-- 1 root root 180 Dec 12 00:02 /data/hosts-2222-12-12
-- 企業中做資料備份時,經常會用到反引号      

03.重定向類型特殊符号

重定向是Linux裡的一個重要名詞,對于它的作用,就是類似于生活中的漏鬥一樣;

可以讓資料從一個地方無損失地流到另一個地方。

序号 名稱 解釋說明
01 标準輸入(stdin) 代碼為0,配合<或<<使用 資料流從右向左
02 标準輸出(stdout) 代碼為1,配合>或>>使用 資料流從左向右
03 标準錯誤(stderr) 代碼為2,配合2>或2>>使用 資料流從左向右
詳細類型解讀
01 标準輸入重定向 0<或< 清空已有内容,資料一般從檔案流向處理指令
02 追加輸入重定向 0<<或<< 追加内容到底部,資料一般從檔案流向處理指令
03 标準輸出重定向 1>或> 正确輸出重定向到檔案,會清空已有的内容
04 标準輸出追加重定向 1>>或>> 将内容追加重定向到檔案底部,不會清空已有的内容
05 錯誤輸出重定向 2> 将标準錯誤内容重定向到檔案,如果檔案存在内容則清空
06 标準錯誤輸出追加重定向 2>> 将标準錯誤内容追加到檔案底部,不會清空已有的内容

标準輸入介紹與實踐

利用标準輸入,可以将指定的檔案内容資訊調取出來,讓指令進行加載處理,可以是覆寫輸入或追加輸入;

# 标準輸入方式讀取檔案内容
[root@xiaoq ~]# echo 1 2 3 > xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt 
1 2 3
[root@xiaoq ~]# cat<xiaoQ.txt
1 2 3
[root@xiaoq ~]# cat 0<xiaoQ.txt
1 2 3

# 标準輸入方式處理檔案内容
[root@xiaoq ~]# tr " " "\n" <xiaoQ.txt 
1
2
3
[root@xiaoq ~]# xargs -n 1 <xiaoQ.txt 
1
2
3
[root@xiaoq ~]# mail -s '郵件标題' 郵件位址 <郵件内容(檔案)
[root@xiaoq ~]# mail -s 'test mail' [email protected] </etc/hosts

# 标準輸入追加重定向
[root@xiaoq ~]# cat <<EOF
xiaoQ
EOF
xiaoQ
-- 讀入資料輸出到螢幕
[root@xiaoq ~]# cat >xiaoQ.txt<<EOF
> xiaoQ
> xiaoA
> xiaoB
> EOF
-- 讀入資料輸出到指定檔案
[root@xiaoq ~]# cat xiaoQ.txt 
xiaoQ
xiaoA
xiaoB      

标準輸出介紹與實踐

利用标準輸出,可以将指定的資料内容資訊輸出到指定檔案中,實作對特定資料資訊的永久保留,便于分析檢視;

# 标準輸出重定向
[root@xiaoq ~]# echo "123" 1>xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt 
123
[root@xiaoq ~]# mkdir -v /test_dir >xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt 
mkdir: created directory ‘/test_dir’

# 可以實作清空檔案資料内容
[root@xiaoq ~]# cat xiaoQ.txt 
123
[root@xiaoq ~]# cat /dev/null >xiaoQ.txt 
或者
[root@xiaoq ~]# >xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt 
-- 清空檔案操作,多用于對系統日志檔案清理操作
# 标準追加輸出重定向
[root@xiaoq ~]# echo 123 >>xiaoQ.txt
[root@xiaoq ~]# echo 456 >>xiaoQ.txt
[root@xiaoq ~]# echo 789 >>xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt       

錯誤輸出介紹與實踐

利用錯誤輸出,可有将指定指令或程式執行過程中出現的錯誤提示資訊輸出到指定檔案中,便于對操作進行複盤;

[root@xiaoq ~]# mkdir /test_dir
mkdir: cannot create directory ‘/test_dir’: File exists
[root@xiaoq ~]# mkdir /test_dir 2> xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt 
mkdir: cannot create directory ‘/test_dir’: File exists      

标準輸出與錯誤輸出結合使用:(生成日志檔案的機制)

# 方法一:1>>檔案 2>>檔案
[root@xiaoq ~]# mkdir -v /test_dir 1>>xiaoQ.txt  2>>xiaoQ.txt
[root@xiaoq ~]# mkdir -v /test_dir 1>>xiaoQ.txt  2>>xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt 
mkdir: created directory ‘/test_dir’
mkdir: cannot create directory ‘/test_dir’: File exists

# 方法二:2>&1
[root@xiaoq ~]# mkdir -v /test_dir >>xiaoQ.txt  2>&1
[root@xiaoq ~]# mkdir -v /test_dir >>xiaoQ.txt  2>&1
[root@xiaoq ~]# cat xiaoQ.txt 
mkdir: created directory ‘/test_dir’
mkdir: cannot create directory ‘/test_dir’: File exists

# 方法三:&>> ※
[root@xiaoq ~]# mkdir -v /test_dir &>>xiaoQ.txt
[root@xiaoq ~]# mkdir -v /test_dir &>>xiaoQ.txt
[root@xiaoq ~]# cat xiaoQ.txt
mkdir: created directory ‘/test_dir’
mkdir: cannot create directory ‘/test_dir’: File exists      

知識點總結:

  • 标準輸入:表示将資料從檔案中流入到處理的指令中,用代碼0表示,使用<或<<符号來訓示資料的流向;
  • 标準輸出:表示将指令處理的資訊輸出到指定檔案中,用代碼1表示,使用>或>>符号來訓示資料的流向;
  • 錯誤輸出:表示将指令操作錯誤的資訊輸出到檔案中,用代碼2表示,使用2>或2>>符号來訓示資料的流向;

04.路徑切換特殊符号

序号 符号 解釋說明
01 ~ 快速切換到使用者的家目錄,超級使用者為root;普通使用者為/home/使用者名稱目錄;
02 - 切換到上一次(相對目前路徑)使用者所在的路徑
03 . 代表目前目錄(點号還有很多其他含義,需要注意)
04 .. 代表上一級目錄

波浪線介紹與實踐

在Linux系統指令行中,~代表使用者的家目錄:

實踐操作作用示範:

[root@xiaoq etc]# pwd
/etc
[root@xiaoq etc]# cd ~
[root@xiaoq ~]# pwd
/root
[root@xiaoq ~]# cd /etc/
[root@xiaoq etc]# pwd
/etc
[root@xiaoq etc]# cd
-- cd指令後什麼資訊都不加,也等價于cd ~作用
[root@xiaoq ~]# pwd
/root      

短橫線介紹與實踐

在Linux系統指令行中,短橫線代表上一次使用者所在的路徑。

實踐操作作用示範:

# 操作過程示範
[root@xiaoq ~]# cd /etc/
[root@xiaoq etc]# 
[root@xiaoq etc]# cd -
/root
[root@xiaoq ~]# pwd
/root
[root@xiaoq ~]# cd -
/etc
[root@xiaoq etc]# pwd
/etc

# 操作過程機制
[root@xiaoq ~]# echo $OLDPWD
/etc
[root@xiaoq ~]# cd -
/etc
[root@xiaoq etc]# echo $OLDPWD
/root
[root@xiaoq etc]# cd $OLDPWD
[root@xiaoq ~]# pwd
/root      

點符号介紹與實踐

在Linux系統指令行中,點号代表目前目錄。

實踐操作作用示範:

[root@xiaoq etc]# pwd
/etc
[root@xiaoq etc]# cd .
[root@xiaoq etc]# pwd
/etc
[root@xiaoq etc]# find . -name "*.sh"  
./dhcp/dhclient-exit-hooks.d/azure-cloud.sh
[root@xiaoq etc]# rm ./xiaoQ* -rf      

雙點号介紹與實踐

在Linux系統指令行中,雙點号代表目前目錄的上一級目錄。

實踐操作作用示範:

[root@xiaoq etc]# pwd
/etc
[root@xiaoq etc]# cd ..
[root@xiaoq /]# pwd
/
[root@xiaoq /]# ls -a /test_dir/
.  ..      

05.邏輯相關特殊符号

序号 符号 解釋說明
01 && 前一個指令執行成功,再執行後面一個指令
02 || 前一個指令執行失敗,再執行後面一個指令
03 ! 在指令執行中有取反作用 find . ! -name "xiaoQ" 在vi/vim中表示強制作用 wq! 在指令前加!表示找出最近一次以指定開頭的指令并執行(慎用)
邏輯符号多用于後續課程的shell腳本編寫中,指令行應用情況比較少見,此時作為了解即可。

邏輯符号&&介紹與實踐

在Linux系統中表示,判斷前一個操作是否成功,如果成功再進行後續的操作;

[root@xiaoq /]# # 有錢 -- 買房
[root@xiaoq /]# rm -rf /test_dir/
[root@xiaoq /]# mkdir /test_dir && cd /test_dir
-- 建立目錄成功後,才會切換目錄
[root@xiaoq test_dir]# pwd
/test_dir
[root@xiaoq test_dir]# cd 
[root@xiaoq ~]# mkdir /test_dir && cd /test_dir/
mkdir: cannot create directory ‘/test_dir’: File exists
-- 建立目錄失敗後,就不會切換目錄
[root@xiaoq ~]# 
[root@xiaoq ~]# mkdir /test_dir ; cd /test_dir/
mkdir: cannot create directory ‘/test_dir’: File exists
-- 對比分号操作,分号分割的多個指令,沒有邏輯概念,會同時執行      

邏輯符号||介紹與實踐

在Linux系統中表示,判斷前一個操作是否失敗,如果失敗再進行後續的操作;

[root@xiaoq ~]# mkdir /test_dir || echo "dir create error"                      ||
mkdir: cannot create directory ‘/test_dir’: File exists
dir create error
-- 建立失敗,會執行的操作
[root@xiaoq ~]# rm /test_dir/ -rf
[root@xiaoq ~]# mkdir /test_dir || echo "dir create error"                      ||
-- 建立成功,就不會執行指定操作      

邏輯符号組合使用情況

判斷成功和判斷失敗邏輯符号也可以組合使用,實作多種情況的靈活處理;

[root@xiaoq ~]# #  && || -- 錢 -- 有錢 && 生活輕松 沒錢 || 努力奮鬥   
[root@xiaoq ~]# rm /test_dir/ -rf
[root@xiaoq ~]# mkdir /test_dir && echo "目錄建立成功" || echo "目錄建立失敗"     ||
目錄建立成功
-- 目錄建立成功處理方案
[root@xiaoq ~]# mkdir /test_dir && echo "目錄建立成功" || echo "目錄建立失敗"     ||
mkdir: cannot create directory ‘/test_dir’: File exists
目錄建立失敗
-- 目錄建立失敗處理方法      

系統正則符号介紹

1、正則符号簡介說明

簡單地說,正規表達式符号就是為處理大量的字元串及文本而定義的一套規則和方法;

通過這些正則符号,管理者可以快速過濾,替換或輸出所需要的字元串。使運維工作更加高效。

正規表達式符号應用非常廣泛,存在于各種語言之中,例如 python java go等語言中都存在;

但是Linux運維人員隻要掌握bash解釋器環境中的正規表達式用法即可,即可三劍客grep sed awk指令,

進行有效的應用,進而提高工作效率即可。

在學習掌握正規表達式時,需要注意以下幾點:

  • 正規表達式是以行為機關進行處理的;
  • 正規表達式僅适用于三劍客指令加載識别(grep sed awk);
  • 正規表達式使用時,主要LC_ALL環境變量要設定為LC_ALL=C;

2、正則符号分類介紹

Linux的正規表達式可分為兩類:

  • 基礎正規表達式(BRE basic regular expression)

對應的正則符号:^$.[]*; 通常預設可以直接被三劍客指令識别;

  • 擴充正規表達式(ERE extended regular expression)

對應的正則符号:(){}?+|;三劍客指令在加載識别時,除awk指令可以直接識别,grep和sed指令都要加指定參數識别

3、基礎正則符号簡介

序号 基礎正則符号 解釋說明
01 ^ 尖角号,用法為"^xiaoQ",表示比對以xiaoQ單詞開頭的行
02 $ 美元符,用法為"xiaoQ$",表示比對以xiaoQ單詞結尾的行
03 ^$ 組合符,表示空行,邏輯解釋就是以^結尾的行,以$開頭的行
04 . 點符号,表示比對任意一個且隻有一個字元(但不能比對空行)
05 \ 轉義符,讓有特殊含義的字元還原本意;讓沒特殊含義字元賦予特殊含義
06 * 星符号,比對前一個字元(連續出現)0次或1次以上 注意:當重複0次的時候,表示什麼也沒有,即比對所有内容
07 .* 組合符,比對所有内容 包含空行資訊
08 ^.* 組合符,比對以任意多個字元開頭的内容
09 .*$ 組合符,比對以任意多個字元結尾的内容
10 [abc] 比對[]集合内的任意一個字元a或b或c;[abc]也可寫成[a-c]
11 [^abc] 比對不包含^号後的任意字元a或b或c,這裡的^表示對[abc]取反 注意:此處不能用!替代
以上基礎正則符号會分為三個部分學習01-05 06-09 10-11;要以視訊操作顯示的資訊為主

4、基礎正則符号實踐

基礎正則符号實踐操作環境準備:

[root@xiaoq ~]# mkdir ~/test
[root@xiaoq ~]# cd  ~/test
[root@xiaoq test]# cat >~/test/xiaoQ.txt<<EOF
I am xiaoQ teacher!
I teach linux.
 
I like badminton ball ,billiard ball and chinese chess!
my qq num is 3052869928.
 
not 3052869999928.
my god ,i am not xiaoB,but XIAOQ
EOF

[root@xiaoq test]# cat -n xiaoQ.txt 
     1  I am xiaoQ teacher!
     2  I teach linux.
     3  
     4  I like badminton ball ,billiard ball and chinese chess!
     5  my qq num is 3052869928.
     6  
     7  not 3052869999928.
     8  my god ,i am not xiaoB,but XIAOQ      
基礎正則符号功能實踐-^

尖角符号表示比對每行以指定字元開頭的資訊;

實踐操作作用示範:輸出以m開頭的所有行并列印行号

[root@xiaoq test]# grep -n "^m" xiaoQ.txt 
5:my qq num is 3052869928.
8:my god ,i am not xiaoB,but XIAOQ      
若沒特殊需求,建議用雙引号将過濾的内容引用起來,否則可能會遇到異常問題。
基礎正則符号功能實踐-$

美元符号表示比對每行以指定字元結尾的資訊;

實踐操作作用示範:輸出以Q結尾的所有行并列印行号

[root@xiaoq test]# grep "Q$" xiaoQ.txt 
my god ,i am not xiaoB,but XIAOQ
[root@xiaoq test]# grep -i "q$" xiaoQ.txt 
my god ,i am not xiaoB,but XIAOQ
[root@xiaoq test]# grep "Q$" xiaoQ.txt|cat -A
my god ,i am not xiaoB,but XIAOQ$      
基礎正則符号功能實踐-^$

實踐操作作用示範:過濾出空行資訊

[root@xiaoq test]# grep -n "^$" xiaoQ.txt 
3:                                                                                   
6:      

實踐操作作用示範:過濾除空行以外資訊

[root@xiaoq test]# grep -nv "^$" xiaoQ.txt 
1:I am xiaoQ teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my qq num is 3052869928.
7:not 3052869999928.
8:my god ,i am not xiaoB,but XIAOQ      
當^開頭與$結尾連在一起時,解可以了解為開頭到結尾中間沒有任何資料内容,即表示的就是空行。
基礎正則符号功能實踐-.

點符号表示比對任意一個字元(有且隻有一個),但不包含空行。

實踐操作作用示範:比對任意一個字元并輸出對應檔案中的行号

[root@xiaoq test]# grep -n "." xiaoQ.txt 
1:I am xiaoQ teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my qq num is 3052869928.
7:not 3052869999928.
8:my god ,i am not xiaoB,but XIAOQ      

比對任意一個字元,是以檔案的内容都出來了,但是上面找到的内容不包含空行。

思考:點表示比對任意字元,并且比對且隻有一個字元,怎麼檔案所有字元都出來了?

實踐操作作用示範:顯示以點結尾的行

[root@xiaoq test]# grep -n ".$" xiaoQ.txt 
1:I am xiaoQ teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my qq num is 3052869928.
7:not 3052869999928.
8:my god ,i am not xiaoB,but XIAOQ      

.$表示的是以任意單個字元結尾的行,是以結果并不是需求的目标。

基礎正則符号功能實踐-\

轉義符号主要用途是讓有特殊含義的符号變為一般符号,當然也可以将沒有作用的字元變為有特殊意義;

實踐操作作用示範:顯示以點結尾的行

[root@xiaoq test]# grep -n "\.$" xiaoQ.txt 
2:I teach linux.
5:my qq num is 3052869928.
7:not 3052869999928.      

實踐操作作用示範:轉義特殊字元資訊

[root@xiaoq test]# echo  "xiaoQnlinux"
xiaoQnlinux
[root@xiaoq test]# echo -e "xiaoQ\nlinux"
xiaoQ
linux
[root@xiaoq test]# echo -e "xiaoQ\tlinux"
xiaoQ linux      
基礎正則符号功能實踐-*

星号表示比對前一個字元0次或0次以上的資料内容;

實踐操作作用示範:輸出檔案中連續出現了0次或0次以上的數字9的内容

[root@xiaoq test]# grep "9*" xiaoQ.txt 
I am xiaoQ teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my qq num is 3052869928.

not 3052869999928.
my god ,i am not xiaoB,but XIAOQ
-- 每行中沒有出現9字元,就表示出現0次,也會比對,是以所有檔案内容都會顯示
[root@xiaoq test]# grep "9" xiaoQ.txt 
my qq num is 3052869928.
not 3052869999928.
-- 單獨過濾數字9,隻有含有9字元的行會出現,沒有9字元(出現0次的)不會顯示      
基礎正則符号功能實踐-.*

.*組合使用時表示比對所有字元,包含空行。

實踐操作作用示範:通過grep顯示檔案的所有内容,包含空行

[root@xiaoq test]# grep ".*" xiaoQ.txt 
I am xiaoQ teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my qq num is 3052869928.

not 3052869999928.
my god ,i am not xiaoB,but XIAOQ

[root@xiaoq test]# grep "." xiaoQ.txt 
I am xiaoQ teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my qq num is 3052869928.
not 3052869999928.
my god ,i am not xiaoB,but XIAOQ      

雖然.*和. 都可以将檔案中的所有資訊進行比對顯示,但是還是有本質差別的,利用grep -o參數可以看出其中奧秘

[root@xiaoq test]# grep -o  ".*" xiaoQ.txt 
I am xiaoQ teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my qq num is 3052869928.
not 3052869999928.
my god ,i am not xiaoB,but XIAOQ
[root@xiaoq test]# grep -o  "." xiaoQ.txt 
I
 
a
m
 
x
i
a      
grep -o參數可以将每次比對的資訊按行單獨顯示,具體說明每次比對的内容。

實踐操作作用示範:比對開頭所有字元,每行到o字元結束/比對從o開始到指定最後字元結束

[root@xiaoq test]# grep   "^.*o" xiaoQ.txt 
I am xiaoQ teacher!
I like badminton ball ,billiard ball and chinese chess!
not 3052869999928.
my god ,i am not xiaoB,but XIAOQ

[root@xiaoq test]# grep "o.*$" xiaoQ.txt 
I am xiaoQ teacher!
I like badminton ball ,billiard ball and chinese chess!
not 3052869999928.
my god ,i am not xiaoB,but XIAOQ      

已經實作了比對任意多個字元開頭一直到第一個字母o為止的内容;

但可以看出實際上比對到了每一行的最後一個字元o,因為正則符号比對資訊以行為機關并且具有貪婪特性。

基礎正則符号功能實踐-[]

中括号表示比對其中的任何一個字元,[abc]會比對a或b或c

比對方式有:

序号 比對方式 解釋說明
01 [a-z] 表示比對所有單個小寫字母
02 [A-Z] 表示比對所有單個大寫字母
03 [a-zA-Z]或[a-Z] 表示比對所有單個英文字母(包含大小寫所有字母)
04 [0-9] 表示比對所有單個數字
05 [a-zA-Z0-9] 表示比對所有字母和數字

實踐操作作用示範:比對檔案中所有的大寫字母

[root@xiaoq test]# grep '[A-Z]' xiaoQ.txt 
I am xiaoQ teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my god ,i am not xiaoB,but XIAOQ      

實踐操作作用示範:比對字元串xiaoQ資訊

[root@xiaoq test]# grep '[xiaoQ]' xiaoQ.txt 
I am xiaoQ teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my qq num is 3052869928.
not 3052869999928.
my god ,i am not xiaoB,but XIAOQ
[root@xiaoq test]# grep 'xiaoQ' xiaoQ.txt 
I am xiaoQ teacher!      

中括号裡面的字元會單個進行比對,并不是看成一個整體進行比對。

基礎正則符号功能實踐-[^]

表示将中括号中的每個字元進行取反比對;

實踐操作作用示範:比對除了小寫字母以外的字元

[root@xiaoq test]# grep "[^a-z]" xiaoQ.txt 
I am xiaoQ teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my qq num is 3052869928.
not 3052869999928.
my god ,i am not xiaoB,but XIAOQ      

5、擴充正則符号簡介

序号 擴充正則符号 解釋說明
01 + 比對前一個字元出現1次或多次情況
02 [ab]+ 比對中括号内a或b字元出現1次或多次情況
03 ? 比對前一個字元出現0次或1次情況
04 | 表示或者,即同時過濾多個字元串
05 () 分組過濾,被括起來的内容表示一個整體
06 a{n,m} 比對前一個字元出現最少n次,最多m次
07 a{n,} 比對前一個字元出現最少n次
08 a{n} 比對前一個字元出現正好n次
09 a{,m} 比對前一個字元最多出現m次
由于以上資訊為擴充正則, 利用grep指令識别擴充正則符号需要使用-E參數或者直接使用egrep指令進行過濾.

6、擴充正則符号實踐

擴充正則符号實踐操作環境準備:

# 測試實踐環境準備:
[root@xiaoq test]# cat > xiaoT.txt<<EOF
> gd
> god
> good
> goood
> gooood
> goooood
> EOF
[root@xiaoq test]# cat xiaoT.txt 
gd
god
good
goood
gooood
goooood      
擴充正則符号功能實踐-+

加号表示比對前一個字元出現1次或1次以上情況, 與基礎正則裡的* 類似, 隻不過比 * 少了一個比對0次

實踐操作作用示範:比對檔案中出現o字元的情況

# 比對連續出現的o字元資訊
[root@xiaoq test]# grep "o*" xiaoT.txt 
gd
god
good
goood
gooood
goooood
-- 比對o出現0次或連續出現多次的情況
[root@xiaoq test]# grep "o+" xiaoT.txt 
-- 擴充正則符号識别時. grep指令加-E參數或直接使用egrep指令
[root@xiaoq test]# grep -E "o+" xiaoT.txt 
god
good
goood
gooood
goooood
-- 比對o出現1次或連續出現多次的情況      
擴充正則符号功能實踐-?

問号表示比對前一個字元出現0次或1次

實踐操作作用示範:比對檔案中包含gd或god的資訊

[root@xiaoq test]# grep -E "go?d" xiaoT.txt 
gd
god
-- g和d間出現0次或1次o字元情況
[root@xiaoq test]# grep -E "go+d" xiaoT.txt 
god
good
goood
gooood
goooood
-- g和d間出現1次或多次o字元情況
[root@xiaoq test]# grep -E "go*d" xiaoT.txt 
gd
god
good
goood
gooood
goooood
-- g和d間出現0次或多次o字元情況      
擴充正則符号功能實踐-|

豎線在擴充正則中表示或者, 可以實作過濾多個字元資訊

實踐操作作用示範:隻過濾檔案中good和goood字元串資訊

[root@xiaoq test]# grep -E "good|goood" xiaoT.txt 
good
goood

# 企業環境應用
[root@xiaoq ~]# grep -E "faild|error" /var/log/server.log
-- 分析日志檔案時, 就會用到多個關鍵資訊進行篩選比對的情況      
擴充正則符号功能實踐-()

小括号表示可以實作分組過濾被括起來的内容, 括号内的資訊表示一個整體

實踐操作作用示範:取出包含good或glad的資訊

# 測試實踐環境調整:
[root@xiaoq test]# echo "glad" >>xiaoT.txt 
[root@xiaoq test]# cat xiaoT.txt 
gd
god
good
goood
gooood
goooood
glad

# 比對good或glad的資訊
[root@xiaoq test]# grep -E "goo|lad" xiaoT.txt 
good
goood
gooood
goooood
glad
[root@xiaoq test]# grep -E "g(oo|la)d" xiaoT.txt 
good
glad      
擴充正則符号功能實踐-{n,m} {n,} {n} {,m}

實踐操作作用示範:比對字元o, 連續出現3到5次的資訊

[root@xiaoq test]# grep -E "o{3,5}" xiaoT.txt 
goood
gooood
goooood      
[root@xiaoq test]# grep -E "o{3,}" xiaoT.txt 
goood
gooood
goooood      
[root@xiaoq test]# grep -E "o{3}" xiaoT.txt 
goood
gooood
goooood      
[root@xiaoq test]# grep -E "o{,5}" xiaoT.txt 
gd
god
good
goood
gooood
goooood
glad