正則表達式與文本處理工具 腳本實戰

正則表達式、文本處理工具與腳本基礎

一、正則表達式

正則表達式分兩類:python

  • ​ 基本正則表達式:BRE
  • ​ 擴展正則表達式:ERE

1.1 基本正則表達式元字符

1.1.1 字符匹配

.               匹配任意單個字符,能夠是一個漢字
[]              匹配指定範圍的任意單個字符,例如:[grain]    [0-9]   [a-z]
[^]             匹配指定範圍外的任意單個字符,例如:[^grain]
[:alnum:]       字母和數字
[:alpha:]       表明任何英文大小寫字母,即a-z,A-Z
[:lower:]       小寫字母,至關於a-z
[:upper:]       大寫字母
[:blank:]       空白字符
[:space:]       水平和垂直的空白字符
[:digit:]       十進制數字
……

1.1.2 匹配次數

用在要指定次數的字符後面,用於指定前面的字符要出現的次數git

*               匹配前面的字符任意次,包括0次
.*              任意長度的任意字符
\?              匹配其前面的字符0或1次
\+              匹配其前面的字符至少1次
\{n\}           匹配前面的字符n次
\{m,n\}         匹配前面的字符至少m次,至多n次
\{,n\}          匹配前面的字符至多n次,<=n
\{n,\}          匹配前面的字符至少n次

1.1.3 位置錨定

^               行首錨定,用於模式的最左側
$               行尾錨定,用於模式的最右側
^PATTERN$       用於模式匹配整行
^$              空行
^[:space:]$     空白行
\<              詞首錨定,用於單詞模式的左側
\>              詞尾錨定,用於單詞模式的右側
\<PATTERN\>     匹配整個單詞

1.1.4 分組其它 或者

分組:()將多個字符捆綁在一塊兒,看成一個總體處理,例如:\(root\)+正則表達式

後向引用:分組括號中的模式匹配到的內容會被正則表達式引擎記錄與內部的變量中,這些變量的命名方式爲:\1,\2,\3……, \1 表示從左側起第一個左括號以及與之匹配右括號之間模式匹配到的字符shell

或者: \|vim

\(string1\(string2\)\)
\1: string1\(string2\)
\2: sting2

1.2 擴展正則表達式

1.2.1 字符匹配元字符

.               匹配任意單個字符,能夠是一個漢字
[]              匹配指定範圍的任意單個字符,例如:[grain]    [0-9]   [a-z]
[^]             匹配指定範圍外的任意單個字符,例如:[^grain]
[:alnum:]       字母和數字
[:alpha:]       表明任何英文大小寫字母,即a-z,A-Z
[:lower:]       小寫字母,至關於a-z
[:upper:]       大寫字母
[:blank:]       空白字符
[:space:]       水平和垂直的空白字符
[:digit:]       十進制數字
……

1.2.2 次數匹配

*               匹配前面字符任意次
?               0或1次
+               1次或屢次
{n}             匹配n次
{m,n}           至少m,至多n次

1.2.3 位置錨定

^               行首
$               行尾
\<,\b           詞首
\>,\b           詞尾

1.2.4 分組其它

()              分組
後向引用:\1,\2,...
|                  或者
a|b             #a或b
C|cat            #C或cat
(C|c)at         #Cat或cat

二、 文本處理之 grep

做用:文本搜索工具,根據用戶指定的「模式」對目標逐行進行匹配檢查,打印匹配到的行bash

模式:由正則表達式字符及文本字符所編寫的過濾條件ide

格式:工具

grep [OPTIONS] PATTERN [FILE...]

常見選項:spa

--color=auto            對匹配到的文本着色顯示
-m #                    匹配#次後中止
-v                      顯示不被pattern匹配到的行
-i                      忽略字符大小寫
-n                      顯示匹配的行號
-c                      統計匹配的行數
-o                      僅顯示匹配到的字符串
-q                      靜默模式,不輸出任何信息
-A #                    後#行
-B #                    前#行
-C #                    先後各#行
-e                      多個選項間邏輯or關係 如:grep -e 'cat' -e 'dog' file
-w                      匹配整個單詞
-E                      使用ERE,至關於egrep
-f file                 根據模式文件處理
-r                        遞歸目錄,但不處理軟連接
-R                      遞歸目錄,並處理軟連接
[root@CentOS8 ~]#df | grep '/dev/sd'
/dev/sda2      104806400 2311224 102495176   3% /
/dev/sda5       52403200  402140  52001060   1% /data
/dev/sda1        1038336  172128    866208  17% /boot
[root@CentOS8 ~]#df|grep '^/dev/sd'|tr -s ' ' %|cut -d% -f5|sort -n|tail -1
17

三、 文本處理之 sed

格式:操作系統

sed [option]... 'script;script;...' inputfile...

經常使用選項:

-n          不輸出模式空間內容到屏幕,即不自動打印
-e          多點編輯
-f file     從指定文件中讀取編輯腳本
-r,-E       使用擴展正則表達式
-i          原處編輯,加後綴表明備份並編輯

script格式:

'地址命令'

地址格式:

1.  不給地址:   對全文進行處理
2.  單地址:
    #:指定的行, $:最後一行
    /pattern/:  被此處模式所匹配到的每一行
3.  地址範圍:
    #,#         從#行到#行,3,6 從第3行到第6行
    #,+#        從#行到+#行,3,+4 從3行到第7行
4.  步長:~
        1~2 奇數行
        2~2 偶數行

命令:

p               打印當前模式空間內容,追加到默認輸出以後
Ip              忽略大小寫輸出
d               刪除模式空間匹配的行,並當即啓用下一輪循環
a [\\]text      之指定行後面追加文本,支持使用\n實現多行追加
i [\\]text      在行前面插入文本
c [\\]text      替換行爲單行或多行文本
w /path/file    保存模式匹配的行至指定文件
r /path/file    讀取指定文件的文本至模式空間中匹配到的行後
=               爲模式空間中的行打印行號
!               模式空間中匹配行取反
s/pattern/string/修飾符        查找替換,支持使用分隔符,也可使用:s@@@,s###
替換修飾符:
g       行內全局替換
p       顯示替換成功的行
w /path/file    將替換成功的行保存到文件中
I,i     忽略大小寫
[root@CentOS8 ~]#sed -n '1,4p' /etc/passwd
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
[root@CentOS8 ~]#

四、 文本處理之 awk

格式:

awk [OPTIONS] 'program' var=value file...
awk [OPTIONS] -f programfile var=value file...

說明:

program一般是被放在單引號中,並能夠由三種部分組成

  • BEGIN語句塊
  • 模式匹配的通用語句塊
  • END語句塊

常見選項:

  • -F 「分隔符」 指明輸入時用到的字段分隔符,默認是連續的空白符
  • -v var=value 變量賦值

Program格式:

pattern{action;...}

pattern:決定動做語句什麼時候觸發及觸發事件,好比:BEGIN,END,正則表達式等

action:對數據進行處理,放在{}內指明,常見:print,printf

動做 print

格式:

print item1,item2,...

說明:

  • 逗號分隔符
  • 輸出item能夠是字符串,也能夠是數值
  • 如省略item,至關於print $0
  • 固定字符須要用" "引發來,而變量和數字不須要
[root@CentOS8 ~]#awk -F: -v OFS=':' '/root/{print $1,$3,$7}' /etc/passwd
root:0:/bin/bash
operator:11:/sbin/nologin
[root@CentOS8 ~]#

五、 文本處理實例

  • 統計出/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶個數,並將用戶都顯示出來
[root@CentOS8 ~]#echo `grep -v '/sbin/nologin' /etc/passwd |wc -l` && grep -v '/sbin/nologin' /etc/passwd | cut -d: -f1
12
root
sync
shutdown
halt
lee
num
number
mageia
slackware
user1
user2
user3
[root@CentOS8 ~]#awk '!/\/sbin\/nologin/{print $NF}' /etc/passwd | wc -l
12
[root@CentOS8 ~]#awk -F: '!/\/sbin\/nologin/{print $1}' /etc/passwd
root
sync
shutdown
halt
lee
num
number
mageia
slackware
user1
user2
user3
[root@CentOS8 ~]#echo `awk '!/\/sbin\/nologin/{print $NF}' /etc/passwd | wc -l` && awk -F: '!/\/sbin\/nologin/{print $1}' /etc/passwd
12
root
sync
shutdown
halt
lee
num
number
mageia
slackware
user1
user2
user3
[root@CentOS8 ~]#
  • 查出用戶UID最大值的用戶名、UID及shell類型
[root@CentOS8 ~]#awk -F: '{print $1,$3,$7}' /etc/passwd | sort -nr -k2|head -n1
nobody 65534 /sbin/nologin
[root@CentOS8 ~]#getent passwd | sort -t: -k3 -n|tail -n1|cut -d: -f1,3,7
nobody:65534:/sbin/nologin
  • 統計當前鏈接本機的每一個遠程主機IP的鏈接數,並按從大到小排序
[root@CentOS8 ~]ss -nt | tail -n +2 | tr -s ' ' : | cut -d: -f6|sort|uniq -c|sort -nr
[root@CentOS8 ~]ss -nt | grep "^ESTAB" | tr -s ' ' : | cut -d: -f6|sort|uniq -c|sort -nr
[root@CentOS8 ~]ss -nt | awk -F" +|:" '/^ESTAB/{print $(NF-2)}' |sort|uniq -c | sort -nr

六、文本編輯 vim

6.1 vim三種模式和轉換

三種常見模式:

  • 命令或普通模式: more模式,能夠實現移動光標,剪切、粘貼文本
  • 插入或編輯模式:用於修改文本
  • 擴展命令或命令模式: 保存,退出等

命令模式 --> 插入模式

i   insert,在光標所在處插入
I   在當前光標所在行的行首輸入
a   在光標所在處的後面輸入
A   在當前光標所在行的行尾輸入
o   在當前光標所在行的下方打開一個新行
O   在當前光標所在行的上方打開一個新行
  • 插入模式 --- Esc ---> 命令模式
  • 命令模式 --- : --- > 擴展命令模式
  • 擴展命令模式 --- Esc ,enter ---> 命令模式

6.2 擴展命令模式經常使用命令

w           寫磁盤文件
wq          寫入並退出
q!          不存盤退出
wq!         強制存盤退出
r file      讀文件內容到當前文件中
w file      將當前文件內容寫入另外一個文件
!command    執行命令
r!command   讀入命令的輸出

6.3 地址定界

/part1/,/part2/     #從第一次被part1匹配開始,一直到第一次被part2匹配結束
/pattern/           #從當前行向下查找,直到匹配pattern的第一行
%           #全文,至關於1,$
$           #最後一行
.,$-1       #當前行到倒數第二行
#           #第 # 行
#,#         #從左側#起始行,到右側#結束行

6.4 地址定界後跟一個編輯命令

d       #刪除
y       #複製
w file  #指定範圍的行另存至指定文件中
r file  #在指定位置插入指定文件中的全部內容

6.5 查找替換

格式

s/要查找的內容/替換的內容/修飾符
修飾符:
    i       #忽略大小寫
    g       #全局替換,默認狀況下,每一行只替換第一次出現
    gc      #全局替換,每次替換前詢問
要查找的內容: 可以使用基本正則表達式
替換爲的內容: 不能使用模式,可是可使用後向引用\1,\2,...等符號,還可使用 "&" 引用前面查找時查到的整個內容

6.6 定製vim工做特性

配置文件

/etc/vimrc      #全局
~/.vimrc        #我的

經常使用特性:

行號
    顯示: set number, 簡寫 set nu
    取消顯示:set nonumber,簡寫 set nonu
複製保留格式
    啓用: set paste
    禁用: set nopaste
Tab用指定空格個數代替
    啓用: set tabstop=# 指定#個空格代替Tab
    簡寫: set ts=#
光標所在行標識線
    啓用: set cursorline,簡寫 set cul
    禁用: set nocursorline

6.7 命令模式

字符間跳轉

​ h:左 l:右 j:下 k:上

單詞間跳轉

​ w: 下一個單詞詞首

​ e: 當前或下一個單詞詞尾

​ b: 當前或前一個單詞詞首

當前頁跳轉

​ H: 頁首 M:頁中間行 L:頁底

​ zt:將光標所在當前行移到屏幕頂端

​ zz:將光標所在當前行移到屏幕中間

​ zb:將光標所在當前行移到屏幕底端

行首行尾跳轉

​ ^ 第一個非空白字符

​ 0 行首

​ $ 行尾

行間移動

​ #G或 :# 跳轉到#行

​ G 最後一行

​ 1G,gg 第一行

句間移動

​ )下一句 ( 上一句

翻屏操做

​ Ctrl+f 向文件尾部翻一屏 Ctrl+b 向文件首部翻一屏

​ Ctrl+d 向文件尾部翻半屏 Ctrl+u 向文件首部翻半屏

刪除命令

​ d 刪除,結合光標跳轉能夠實現範圍刪除

​ d$ 刪除到行尾

​ d^ 刪除到非空行首

​ dd 剪切光標所在行

​ #dd 多行刪除

​ D:從當前光標位置一直刪除到行尾,至關於d$

複製命令

​ y$ 複製

​ y0 複製到行尾

​ y^ 複製到非空行首

​ yy 複製行

​ #yy 複製多行

​ Y: 複製整行

查找:

/pattern: 從當前光標所在處向文件尾部查找

?pattern: 從當前光標所在處向文件首部查找

n: 與命令同方向

N: 與命令反方向

撤銷更改:

u 撤銷最近的更改

#u 撤銷以前屢次更改

U 撤銷光標落在這行後全部此行的更改

. 重複前一個操做

#. 重複前一個操做#次

七、shell腳本基礎

shell腳本:包含一些命令或聲明,並符號必定格式的文本文件

格式要求: 首行shebang機制

#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

7.1 腳本實例

  • 編寫腳本disk.sh,顯示當前硬盤分區中空間利用率最大的值
[root@CentOS8 script]#bash disk.sh
17
[root@CentOS8 script]#cat disk.sh
#!/bin/bash
df -h| awk -F" +|%" '/\/dev\/sd/{print $5}'|sort -nr|head -n1
  • 編寫腳本 system_info.sh,顯示當前主機系統信息,包括:主機名,IPv4地址,操做系統版本,內核版本,CPU型號,內存大小,硬盤大小
[root@CentOS8 script]#cat system_info.sh 
#!/bin/bash
RED="\E[1;31m"
GREEN="echo -e \E[1;32m"
END="\E[0m"
$GREEN-------------------Host systeminfo--------------------$END
echo -e "HOSTNAME:  $RED`hostname`$END"
echo -e "IPADDR:    $RED`ifconfig ens33|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1`$END"
echo -e "OSVERSION: $RED`cat /etc/redhat-release`$END"
echo -e "KERNEL:    $RED`uname -r`$END"
echo -e "CPU:       $RED`lscpu|grep 'Model name'|tr -s ' '|cut -d: -f2`$END"
echo -e "MEMORY:    $RED`free -h|grep Mem|tr -s ' ' :|cut -d: -f2`$END"
echo -e "DISK:      $RED`lsblk|awk '/^sd/{print $1,$4}'`$END"
$GREEN------------------------------------------------------$END
[root@CentOS8 script]#
相關文章
相關標籤/搜索