學習Linux第二週

10 文本處理工具和正則表達式

文本編輯種類html

​ ♦ 全屏編輯器:nano (字符工具),gedit(圖形化工具),vi,vimgit

​ ♦ 行編輯器: sed正則表達式

10.1 vim命令
10.1.1 經常使用命令鍵
#進入一個練習文檔或者vim自帶的練習冊vimtutor
[root@centos82s ~]$vimtutor

===============================================================================
=    W e l c o m e   t o   t h e   V I M   T u t o r    -    Version 1.7      =
===============================================================================

     Vim is a very powerful editor that has many commands, too many to
     explain in a tutor such as this.  This tutor is designed to describe
     enough of the commands that you will be able to easily use Vim as
     an all-purpose editor.
#練習開始,用vim進入文檔是命令模式
i       按i鍵進入插入模式,便可編輯,按Esc回到命令模式
:wq     保存退出(:w 保存,:q 退出)
:w      保存不退出
:q      退出
:q!     不保存,退出
:!command   執行命令
:r!command  讀入命令的輸出
:w!command  將當前文件內容寫入到另外一個文件
#光標移動
hjkl    左下上右移動光標,同↑↓←→
w,b     以單詞詞首爲單位移動光標
e       以單詞詞尾爲單位移動光標
0,^     以行爲單位,移動光標至行首
$       一行爲單位,移動光標至行尾
gg      以文章行號爲單位,移動光標到第一行
G       以文章行號爲單位;num+G:移動光標到num行
H       以當前屏幕爲單位,移動光標到第一行
M       以當前屏幕爲單位,移動光標到中間
L       以當前屏幕爲單位,移動光標到最後一行
(       以句子爲單位,移動光標到上一句
)       以句子爲單位,移動光標到下一句
{       以段落爲單位,移動光標到上一段落
}       以段落爲單位,移動光標到下一段落
Ctrl+f  以當前屏幕爲單位,下移一屏幕
Ctrl+b  以當前屏幕爲單位,上移一屏幕
Ctrl+d  以當前屏幕爲單位,下移半屏幕
Ctrl+u  以當前屏幕爲單位,上移半屏幕
#複製
y$      複製當前光標到行尾的全部字符
y0      複製當前光標到行首的全部字符
y^      複製當前光標到非空行的行首
ye      複製當前光標到單詞的詞尾
yw      複製當前光標到單詞的詞尾
yb      複製光標以前的全部字符,除光標位置的字符
yy      複製當前光標所在行全部內容
Y       複製當前光標所在行全部內容,不含換行符
#刪除
x       刪除當前光標所在的一個字符
dd      刪除當前行,並把刪除的行保存到剪切板
db      刪除光標以前的全部字符,除光標位置的字符,並把刪除的行保存到剪切板(cb功能同樣)
c$      刪除當前光標到行尾的全部內容,進入插入模式
c^      刪除當前光標到非空行首的全部內容,進入插入模式
c0      刪除當前光標到行首的全部內容,進入插入模式
ce      刪除當前光標到詞尾的內容,進入插入模式
cw      刪除當前光標到詞尾的內容,進入插入模式
cc      刪除當前光標所在行;num+cc:刪除num行;進入插入模式
C       刪除當前光標到行尾的全部內容,進入插入模式
#插入
a       進入插入模式並在光標後插入數據
o       進入插入模式並在當前行下面插入一個新行(小o)
O       進入插入模式並在當前行上面插入一個新行(大O)
#粘貼
p       粘貼剪切板內容,和dd鍵、yy鍵配合使用
#撤銷更改
u       撤銷最近的修改
num+u   撤銷以前num次的修改
U       撤銷光標落在此行後的全部修改
Ctrl+r  撤銷以前的撤銷,相對於Windows中Ctrl+y
num.    重複前一個操做num次
#高級用法
0y$     複製行首到行尾
10iroot 粘貼10次root,按Esc退出
di"     光標在符號之間,刪除符號之間的內容,注意符號成對,如""
yi"     光標在符號之間,複製符號之間內容,注意符號成對,如""
vi"     光標在符號之間,選中符號之間內容,注意符號成對,如""
dt+x    刪除字符直至遇到第一個x字符,x可爲其它
yt+x    複製字符直至遇到第一個x字符,x可爲其它
10.1.2 地址定界
#格式::start_pos,end_pos CMD
num     光標定位到num行
num,num1    從num行到num1行
num,+num1   從num行到num+num1行
.       當前行
$       最後一行
.,$-1   當前行到倒數第二行
%       全文,相對於1,$
#匹配到後續操做纔有效
/param/     匹配param值
/param/,/param1/    匹配param值到param1值結束
num,/param/     從num行開始,匹配到param值結束
/param/,$       從匹配到param開始到最後一行
10.1.3 查找並替換
#格式:s/param/param1/修飾符
i       忽略大小寫
g       全局替換
gc      全局替換,每次替換前詢問
若出現/param,可使用@,#代替/,好比s#/etc#param#g

查找參數明明存在,若出現下圖狀況使用:
學習Linux第二週shell

10.1.4 定製vim工做特性

​ 擴展命令模式的配置只對當前vim進程有效,可將配置存放在文件永久保存apache

#配置文件
/etc/vimrc      全局
~/.vimrc        我的
#行號
啓用:set number,簡寫:set nu
關閉:set nonumber,簡寫:set nonu
#忽略字符大小寫
啓用:set ignorecase,簡寫:set ic
關閉:set noignorecase,簡寫set noic
#自動縮進
啓用:set autoindent,簡寫:set ai
關閉:set noautoindent,簡寫:set noai
#複製保留格式
啓用:set paste
關閉:set nopaste
#顯示Tab和換行符(^I和$)
啓用:set list
關閉:set nolist
#高亮搜索
啓用:set hlsearch
關閉:set nohlsearch 簡寫:set nohl
#語法高亮
啓用:syntax on
關閉:syntax off
#文件格式
啓用Windows格式:    set fileformat=dos
啓用Unix格式:   set fileformat=unix
簡寫: set ff=dos|unix
#tab 用空格代替
啓用:set expandtab    默認爲8個空格
禁用:set noexpandtab  簡寫:set et
#設置tab空格個數
啓用:set tabstop=num  num空格個數
簡寫:set ts=4
#設置文本寬度
啓用:set textwidth=80 簡寫:set tw=80
#設置光標所在行的標示線
啓用:set cursorline,  簡寫:set cul
關閉:set nocursorline
#加密
啓用:set key=password 禁用:set key=
#set幫助
:help option-list
:set or :set all
10.2 可視化模式

​ 在末行有「-- VISUAL ...-- 」指示,表示可視化模式編程

​ 容許選擇的文本塊vim

​ ♦ v 面向字符,-- VISUAL -- c#

​ ♦ V 面向整行,-- VISUAL LINE --centos

​ ♦ Ctrl+v 面向塊,-- VISUAL BLOCK --緩存

​ 可視化可結合箭頭,h,j,k,l等使用。選中的文字可被刪除,複製,修改,過來,搜索,替換等

​ 以下所示,在每行行首插入#字符

​ 一、先將光標移到第一行行首

​ 二、按Ctrl+v鍵,進入可視化模式

​ 三、輸入G鍵到最後一行

​ 四、輸入I到插入模式

​ 五、輸入#

​ 六、按Esc鍵退出插入模式,完成

學習Linux第二週

​ 以下所示,在指定塊位置插入相同內容

​ 一、光標定位到要操做的位置

​ 二、Ctrl+v,進入可視化模式

​ 三、按I鍵,進入插入模式

​ 四、輸入@

​ 五、按Esc鍵退出,完成
學習Linux第二週

10.3 多文件模式
#vim file1 file2 file3 或 vim file[1-3]
:next       切換到下一個文件
:prev       切換到上一個文件
:first      切換到第一個文件
:last       切換到最後一個文件
:wall       保存全部
:qall       不保存退出全部
:wqall      保存退出全部
10.4 多窗口模式

​ vim -o|-O file1 file2

​ -o: 上下分割

​ -O: 左右分割

​ 窗口切換:Ctrl+w

​ 10.4.1 單文件窗口分割

​ Ctrl+w,s 水平分割,上下分屏

​ Ctrl+w,v 垂直分割,左右分屏

​ Ctrl+w,q 取消相鄰窗口

​ Ctrl+w,o 取消所有分屏窗口

​ :wqall 退出

10.5 vim的寄存器

​ vim有26個命名寄存器和1個無命名寄存器,存放不一樣的剪切板內容,能夠在同一個主機的不一樣會話(終端窗口)間共享

​ 寄存器名稱a..z格式 格式:"寄存器+命令 ,放在數字和命令之間

​ 寄存器的主要功能就是緩存操做過程當中刪除、複製、搜索等的文本內容

10.6 標記和宏(macro)

​ ma 將當前位置標記爲a,26個字母都可作標記,mb、mc等等

​ 'a 跳轉到a標記的位置,實用的文檔內標記方法,文檔中跳躍編輯時頗有用

​ qa 錄製宏a,a爲宏的名稱,末行提示:recording @a

​ q 中止錄製宏

​ @a 執行宏a

​ @@ 從新執行上次執行的宏

10.7 編制二進制文件
#以二進制方式打開文件
vim -b file
#擴展命令模式下,利用xxd命令轉換爲可讀的十六進制
:%!xxd
#切換至插入模式,編輯二進制文件
#切換至擴展命令模式下,利用xxd命令轉換回二進制
:%!xxd -r
#保存退出

11 文本常見處理工具

11.1 查看文本文件內容
11.1.1 cat

​ 命令經常使用選項

​ ♦ -E 顯示行結束符$

​ ♦ -A 顯示全部控制符

​ ♦ -n 對顯示出的行編號

​ ♦ -b 對非空行編號

​ ♦ -s 壓縮連續的空行成一行

#-E
[root@centos82s data]$cat -E f1.txt
1$
$
2$
3$
#-A
[root@centos82s data]$cat -A f1.txt
1$
^I$
2$
3$
#-n
[root@centos82s data]$cat -n f1.txt
     1  1
     2      
     3  2
     4  3
     5  4
     6  5
#-b
[root@centos82s data]$cat -b f1.txt
     1  1
     2                   此行存在tab字符,因此不爲空
     3  2
     4  3
     5  4
     6  5

     7  6
#-s
[root@centos82s data]$cat -s f1.txt
1

2
3
4
5

6
11.1.2 tac
#逆向顯示文本內容
[root@centos82s data]$tac f1.txt

9 

8

6

5
4
3
2

1
[root@centos82s data]$tac
a
b
c
d       按Ctrl+d
d
c
b
a
[root@centos82s data]$seq 5
1
2
3
4
5
[root@centos82s data]$seq 5|tac
5
4
3
2
1
11.1.3 nl

​ 顯示行號,相對於cat -b

[root@centos82s data]$nl f1.txt
     1  1
     2      
     3  2
     4  3
     5  4
     6  5

     7  6
11.1.4 rev

​ 將同一行的內容逆向顯示

[root@centos82s data]$cat f2.txt
1 2 3 4 5
a b c
[root@centos82s data]$rev f2.txt
5 4 3 2 1
c b a
#手動輸入,按enter鍵,逆向顯示
[root@centos82s data]$rev
1 2 3 4 5 6
6 5 4 3 2 1
[root@centos82s data]$echo {1..5}
1 2 3 4 5
[root@centos82s data]$echo {1..5}|rev
5 4 3 2 1
11.2 查看非文本文件內容
11.2.1 hexdump
[root@centos82s data]$hexdump -C -n 512 sda
00000000  eb 63 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.c..............|

[root@centos82s data]$echo {a..z}|tr -d ' '|hexdump -C
00000000  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 70  |abcdefghijklmnop|
00000010  71 72 73 74 75 76 77 78  79 7a 0a                 |qrstuvwxyz.|
0000001b
11.2.2 od

​ od即dump files in octal and other formats(轉儲文件的八進制和其餘格式)

#十六進制
[root@centos82s data]$echo {a..z}|tr -d ' '|od -t x
0000000 64636261 68676665 6c6b6a69 706f6e6d
0000020 74737271 78777675 000a7a79
0000033
[root@centos82s data]$echo {a..z}|tr -d ' '|od -t x1
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70
0000020 71 72 73 74 75 76 77 78 79 7a 0a
0000033
[root@centos82s data]$echo {a..z}|tr -d ' '|od -t x1z
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  >abcdefghijklmnop<
0000020 71 72 73 74 75 76 77 78 79 7a 0a                 >qrstuvwxyz.<
0000033
11.2.3 xxd
[root@centos82s data]$echo {a..z}|tr -d ' '|xxd
00000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70  abcdefghijklmnop
00000010: 7172 7374 7576 7778 797a 0a              qrstuvwxyz.
11.3 分頁查看文件內容
11.3.1 more

​ 能夠實現分頁查看文件,能夠配合管道實現輸出信息的分頁

​ 經常使用快捷鍵

​ ♦ enter 文件下移一行

​ ♦ space 文件下翻一頁

​ ♦ b 文件上翻一頁

​ 當下移到最後一行時,將退出more命令,若是想查看前面內容,只能從新執行一遍more命令

[root@centos82s data]$more /etc/init.d/functions
11.3.1 less

​ 基本功能和more相似

​ 經常使用快捷鍵

​ ♦ ↑↓ 上移和下移一行

​ ♦ enter 文件下移一行

​ ♦ space 文件下翻一頁

​ ♦ b 文件上翻一頁

​ ♦ g 光標定位到文件開始

​ ♦ G 光標定位到文件最後

​ ♦ /param 搜索匹配param的字符串

​ ♦ n/N 跳到下一個或上一個匹配

11.3.2 more和less配合管道使用
#分頁顯示 /etc下的文件列表
[root@centos82s ~]$ls -R /etc/|more
/etc/:
adjtime
aliases
alternatives
anacrontab
audit
authselect
bash_completion.d
....
#分頁顯示系統啓動信息
[root@centos82s ~]$dmesg|less
[    0.000000] Linux version 4.18.0-193.el8.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)) #1 SMP Fri May 8 10:59:10 UTC 2020
[    0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-193.el8.x86_64 root=UUID=5e437624-9610-4d5d-804b-ec9054e9f46d ro crashkernel=auto resume=UUID=9c230f26-8349-4153-b1d6-742a6a7b7088 rhgb quiet
....
11.4 顯示文本前或後行內容
11.4.1 head

​ 能夠顯示文件或標準輸入的前面行

​ 經常使用命令選項

​ ♦ -c num 指定獲取前num字節

​ ♦ -n num 指定獲取前num行

​ ♦ -num 同上

#默認獲取文件前10行
[root@centos82s data]$head 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
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
operator:x:11:0:operator:/root:/sbin/nologin
#指定獲取文件前10個字符
[root@centos82s data]$head -c 10 passwd
root:x:0:0
#指定獲取文件前5行
[root@centos82s data]$head -n 5 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#顯示第一行到倒數第八行的內容
[root@centos82s data]$seq 10|head -n -8
1
2
11.4.2 tail

​ tail和head相反,能夠顯示文件或標準輸入的倒數行

​ 經常使用命令選項

​ ♦ -c num 指定獲取後num字節

​ ♦ -n num 指定獲取後num行

​ ♦ -num 同上

​ ♦ -f 跟蹤顯示文件fd新追加的內容,經常使用日誌監控,相對於--follow=descriptor,當文件刪 除再新建同名文件,將沒法進行跟蹤文件

​ ♦ -F 跟蹤文件名,相對於--follow=name --retry,當文件刪除再新建同名文件,將能夠繼 續跟蹤文件

​ ♦ tailf 相似tail -f,當文件不增加時並不訪問文件

​ ♦ -fn0/-0f -Fn0/-0F 只查看最新發生的日誌

#默認獲取文件後10行
[root@centos82s data]$tail passwd
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rngd:x:995:992:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
dou:x:1000:1000:dou:/home/dou:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
admins:x:1001:1001::/home/admins:/bin/bash
honghong:x:1002:1002::/home/honghong:/bin/bash
lanlan:x:1003:1003::/home/lanlan:/bin/bash
#指定獲取文件後5行內容
[root@centos82s data]$tail -n 5 passwd
dou:x:1000:1000:dou:/home/dou:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
admins:x:1001:1001::/home/admins:/bin/bash
honghong:x:1002:1002::/home/honghong:/bin/bash
lanlan:x:1003:1003::/home/lanlan:/bin/bash
#指定獲取文件後5個字節
[root@centos82s data]$tail -c 5 passwd
bash
#特殊用法
[root@centos82s data]$seq 10|tail -n 5
6
7
8
9
10
#顯示倒數第一行到倒數第八行的內容
[root@centos82s data]$seq 10|tail -n -8
3
4
5
6
7
8
9
10
#新建ping.log文件,打開一個終端執行下面的命令,將返回結果重定向到ping.log
[root@centos82s data]$touch ping.log
[root@centos82s data]$echo hello >> ping.log
#在打開一個終端,使用命令tail -f ping.log查看,tail程序會持續地顯示出ping.log文件後續增長的內容
[root@centos82s data]$tail -fn0 ping.log
hell
hello
#把文件刪除,從新建立ping.log,再使用tail命令追蹤,
[root@centos82s data]$rm -rf ping.log
[root@centos82s data]$tail -f ping.log
tail: cannot open 'ping.log' for reading: No such file or directory
tail: no files remaining
[root@centos82s data]$touch ping.log
#小f再也不生效
[root@centos82s data]$tail -f ping.log
#大F繼續追蹤
[root@centos82s data]$tail -Fn0 ping.log
hello
hello
tail: 'ping.log' has become inaccessible: No such file or directory
tail: 'ping.log' has appeared;  following new file
hello
11.5 按列抽取文本 cut

​ cut命令能夠提取文本文件或STDIN數據的指定列

​ 命令經常使用選項

​ ♦ -d 指明分隔符,默認tab

​ ♦ -f fileds:

​ #: 第#個字段,例如:3

​ #,#[,#]: 離散多個字段,例如:1,3,5

​ #-#: 連續的多個字段,例如:1-6

​ 混合使用:1-3,7

​ ♦ -c 按字符切割

​ ♦ --output-delimiter=STRING指定輸出分隔符

#以:爲分隔符,抽取
[root@centos82s data]$cut -d: -f1,3-4,7 passwd
root:0:0:/bin/bash
bin:1:1:/sbin/nologin
daemon:2:2:/sbin/nologin
adm:3:4:/sbin/nologin
lp:4:7:/sbin/nologin
sync:5:0:/bin/sync
shutdown:6:0:/sbin/shutdown

[root@centos82s data]$df|tr -s ' '|cut -d ' ' -f5|tr -dc "[0-9]\n"

0
0
2
0
3
15
15
0

[root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]'

0
0
2
0
3
15
15
0

[root@centos82s data]$df|tr -s ' '|cut -d ' ' -f5|tr -d %|tail -n +2
0
0
2
0
3
15
15
0
11.6 合併多個文件 paste

​ paste合併多個文件同行號的列到一行

​ 命令經常使用選項

​ ♦ -d 分隔符:指定分隔符,默認用tab

​ ♦ -s 全部行合成一行顯示

#列顯示
[root@centos82s data]$cat alpha.log seq.log
a
b
c
d
e
f
g
h
1
2
3
4
5
[root@centos82s data]$paste alpha.log seq.log
a   1
b   2
c   3
d   4
e   5
f   
g   
h   
[root@centos82s data]$paste -d: alpha.log seq.log
a:1
b:2
c:3
d:4
e:5
f:
g:
h:
#行顯示
[root@centos82s data]$paste -s alpha.log seq.log
a   b   c   d   e   f   g   h
1   2   3   4   5
11.7 分析文本的工具

​ 文本數據統計:wc

​ 整理文本: sort

​ 比較文件: diff和patch

11.7.1 收集文本統計數據 wc

​ wc命令可用於統計文件的行總數、單詞總數、字節總數和字符總數,能夠對文件或STDIN中的 數據統計

​ 命令經常使用選項

​ ♦ -l 只計算行數

​ ♦ -w 只計算單詞總數

​ ♦ -c 只計算字節總數

​ ♦ -m 只計算字符總數

​ ♦ -L 顯示文件中最長行的長度

[root@centos82s data]$wc seq.log
 5    5    10 seq.log
行數 單詞數 字節數
[root@centos82s data]$wc -l seq.log
5 seq.log
#取倒數第一行到倒數第八行
[root@centos82s ~]$df|tail -n $(echo `df|wc -l` -1|bc)
devtmpfs          905156       0    905156   0% /dev
tmpfs             921932       0    921932   0% /dev/shm
tmpfs             921932   17092    904840   2% /run
tmpfs             921932       0    921932   0% /sys/fs/cgroup
/dev/sda2      104806400 2196452 102609948   3% /
/dev/sda5       52403200 7799112  44604088  15% /data
/dev/sda1         999320  137604    792904  15% /boot
tmpfs             184384       0    184384   0% /run/user/0
11.7.2 文本排序 sort

​ 把整理過的文本顯示在STDOUT,不改變原始文件

​ 命令經常使用選項

​ ♦ -r 執行反方向(由上至下)整理

​ ♦ -R 隨機排序

​ ♦ -n 執行按數字大小整理

​ ♦ -h 人類可讀排序,如:2k 1G

​ ♦ -f 選項忽略(fold)字符串中的字符大小寫

​ ♦ -u 選項(獨特,unique),合併重複項,即去重

​ ♦ -t c 選項使用c作爲字段界定符

​ ♦ -k 選項按照使用c字符分隔的#列來整理可以使用屢次

[root@centos82s data]$cut -d: -f1,3 passwd|sort -t: -k2 -nr|head -n 3
nobody:65534
lanlan:1003
honghong:1002
#統計日誌同一個ip訪問的數量
[root@centos82s data]$cut -d" " -f1 access_log|sort -u|wc -l
201
#統計分區利用率
[root@centos82s data]$df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          905156       0    905156   0% /dev
tmpfs             921932       0    921932   0% /dev/shm
tmpfs             921932   17092    904840   2% /run
tmpfs             921932       0    921932   0% /sys/fs/cgroup
/dev/sda2      104806400 2196416 102609984   3% /
/dev/sda5       52403200 7831184  44572016  15% /data
/dev/sda1         999320  137604    792904  15% /boot
tmpfs             184384       0    184384   0% /run/user/0
#查看分區利用率最高值
[root@centos82s data]$df|tr -s ' ' '%'|cut -d% -f5|sort -nr|head -1
15
[root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]'|sort -nr|head -1
15
[root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]'|sort -n|tail -1
15
[root@centos82s data]$df|tr -s ' ' %|cut -d% -f5|tr -d '[:alpha:]'|sort -nr|head -n1
15
#對指定的列數字排序
[root@centos82s data]$sort passwd
admins:x:1001:1001::/home/admins:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
...
#以:爲分隔符,對第三列即UNID按字母次序排序,取前三行
[root@centos82s data]$sort -t: -k3 passwd|head -n 3
root:x:0:0:root:/root:/bin/bash
dou:x:1000:1000:dou:/home/dou:/bin/bash
admins:x:1001:1001::/home/admins:/bin/bash
#以:爲分隔符,對第3列即UNID按數字大小倒序排序,取前三行
[root@centos82s data]$sort -t: -k3 -nr passwd|head -n 3
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
lanlan:x:1003:1003::/home/lanlan:/bin/bash
honghong:x:1002:1002::/home/honghong:/bin/bash
#-R,隨機排序
[root@centos82s data]$seq 5|sort -R
3
5
1
2
4
[root@centos82s data]$seq 5|sort -R
1
4
3
5
2
#-u去除重複的行
[root@centos82s data]$cut -d: -f7 passwd|sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
...
[root@centos82s data]$cut -d: -f7 passwd|sort -u
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/shutdown
11.7.3 去重 uniq命令

​ 去除相鄰重複的行

​ 命令經常使用選項

​ ♦ -c 顯示重複次數

​ ♦ -d 顯示重複過的行

​ ♦ -u 顯示沒有重複過的行

#原文件輸出
[root@centos82s data]$cat num1.txt 
123
123
43
200
3321
3321
345
456
200
#去重
[root@centos82s data]$uniq num1.txt 
123
43
200
3321
345
456
200
#-c
[root@centos82s data]$uniq -c num1.txt 
      2 123
      1 43
      1 200
      2 3321
      1 345
      1 456
      1 200
#-d
[root@centos82s data]$uniq -d num1.txt 
123
3321
#-u
[root@centos82s data]$uniq -u num1.txt 
43
200
345
456
200
#統計日誌訪問量最多的請求,取前三行
[root@centos82s data]$cut -d" " -f1 access_log|sort|uniq -c|sort -nr|head -n 3
   4870 172.20.116.228
   3429 172.20.116.208
   2834 172.20.0.222
11.7.4 diff

​ diff命令能夠對比兩個文件的不一樣之處,方便查看改動過的內容

​ 命令經常使用選項

​ ♦ -y 選擇並排對比

​ ♦ -W 指定行寬度

​ ♦ -u 以unified格式顯示

[root@centos82s data]$cat num1.txt 
1
2
3
4
5
6
7
8
9
[root@centos82s data]$cat num2.txt
1
2
33
4
55
6
#比較兩個文件
[root@centos82s data]$diff num1.txt num2.txt 
3c3
< 3
---
> 33
5c5
< 5
---
> 55
7,9d6
< 7
< 8
< 9
#說明:上面的3c3,5c5表示兩個文件在第3行和第5行內容不一樣,7,9d6表示第一個文件比第二個文件多了7到9行
#-y,-W並排對比
[root@centos82s data]$diff num1.txt num2.txt -y -W 30
1       1
2       2
3         | 33
4       4
5         | 55
6       6
7         <
8         <
9         <
[root@centos82s data]$diff num2.txt num1.txt -y -W 30
1       1
2       2
33        | 3
4       4
55        | 5
6       6
          > 7
          > 8
          > 9
"|"     表示兩個文件內容的不一樣
"<"     表示後面文件比前面文件少了一行內容
">"     表示後面文件比前面文件多了一行內容
#-u 以unified格式顯示
[root@centos82s data]$diff -u num1.txt num2.txt
--- num1.txt    2020-08-07 00:40:40.191763464 +0800
+++ num2.txt    2020-08-07 00:44:14.331778309 +0800
@@ -1,9 +1,6 @@
 1
 2
-3
+33
 4
-5
+55
 6
-7
-8
-9
"-":表示第一個文件,
"+":表示第二個文件,
"-1,9":表示第一個文件的第一行到第九行,
"+1,6":表示第二個文件的第一行到第六行,
"-3/-5/-7/-8/-9":表示第一個文件刪除此行,能夠和第二個文件行相同
"+33/+55":表示第一個文件添加此行,能夠和第二個文件行相同
11.7.5 patch 還原文件

​ 利用patch命令,結合diff輸出的unified格式信息和兩個文件任意一個,能夠生成另外一個文件

​ 命令經常使用選項

​ ♦ -b 備份參考文檔,文件名稱後綴加.orig

#對比生成unified格式信息
[root@centos82s data]$diff -u num1.txt num2.txt > diff.txt
[root@centos82s data]$ll
total 7432632
-rw-r--r-- 1 root root        149 Aug  7 01:08  diff.txt
#刪除一個文件
[root@centos82s data]$rm -f num2.txt 
[root@centos82s data]$ll
total 7432628
-rw-r--r-- 1 root root        149 Aug  7 01:08  diff.txt
-rw-r--r-- 1 root root         18 Aug  7 00:40  num1.txt
#-b表示先備份num1.txt爲num1.txt.orig,num1.txt內容是恢復的原num2.txt的數據,把num1.txt重命名爲num2.txt,把num1.txt.orig重命名爲num1.txt,搞定
[root@centos82s data]$patch -b num1.txt diff.txt
patching file num1.txt
[root@centos82s data]$ls
 num1.txt.orig   diff.txt   num1.txt

12 文本處理三劍客

12.1 三劍客之 grep

​ 命令經常使用選項,param表明正則表達式

​ ♦ -color=auto 對匹配到的文本着色顯示

​ ♦ -m num 匹配num次後中止

​ ♦ -v 顯示不被param匹配到的行

​ ♦ -i 忽略大小寫

​ ♦ -n 顯示匹配的行號

​ ♦ -c 統計匹配的行數

​ ♦ -o 僅顯示匹配到的字符串

​ ♦ -q 靜默模式,不輸出任何信息,使用$?查看,0:匹配,1:沒有匹配

​ ♦ -A num after,後num行

​ ♦ -B num before,前num行

​ ♦ -C num context,先後各num行

​ ♦ -e 實現多個選項間的邏輯 or 關係,如:grep -e 'cat' -e 'dog' file

​ ♦ -w 匹配整個單詞

​ ♦ -E 使用ERE

​ ♦ -F 至關於fgrep,不支持正則表達式

​ ♦ -f file 根據模式文件處理

​ ♦ -r 遞歸目錄,不處理軟連接

​ ♦ -R 遞歸目錄,處理軟連接

#列出passwd文件中匹配到root的行
[root@centos82s data]$grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#默認會對搜索到的內容着色顯示
[root@centos82s data]$alias grep
alias grep='grep --color=auto'
#-v,排除過濾,列出沒有匹配到root的行
[root@centos82s data]$grep -v root passwd
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
...
#-i,忽略大小寫
[root@centos82s data]$grep ROOT passwd
[root@centos82s data]$grep -i ROOT passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#顯示行號
[root@centos82s data]$grep -n root passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
#顯示匹配到行的次數
[root@centos82s data]$grep -c root passwd
2
#只顯示匹配到的內容,行的其它內容不顯示
[root@centos82s data]$grep -o root passwd
root
root
root
root
#-q,靜默模式,不輸出信息,使用$?查看是否匹配
[root@centos82s data]$grep -q root passwd
[root@centos82s data]$echo $?
0
#
[root@centos82s data]$grep -n root passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
#匹配到行的後三行,和匹配行內容一塊兒輸出
[root@centos82s data]$grep -nA3 root passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
#匹配到行的前三行,和匹配行內容一塊兒輸出
[root@centos82s data]$grep -nB3 root passwd
1:root:x:0:0:root:/root:/bin/bash
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
#匹配到行的先後三行,和匹配行內容一塊兒輸出
[root@centos82s data]$grep -nC3 root passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
#-e,屢次過濾,多個條件「或」的關係
[root@centos82s data]$grep -e root -e dou passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dou:x:1000:1000:dou:/home/dou:/bin/bash
#"|"下面是與的關係
[root@centos82s data]$grep dou passwd|grep bin
dou:x:1000:1000:dou:/home/dou:/bin/bash
#-w,匹配單詞,不模糊匹配
[root@centos82s data]$grep adm passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
admins:x:1001:1001::/home/admins:/bin/bash
[root@centos82s data]$grep -w adm passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
#-f,用文件存放過濾條件
[root@centos82s data]$cat f1.txt
root
dou
[root@centos82s data]$grep -f f1.txt passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dou:x:1000:1000:dou:/home/dou:/bin/bash
12.2 三劍客之 sed

​ sed即Stream EDitor,和vi不一樣,sed是行編輯器

​ sed是從文件或管道中讀取一行,處理一行,直到最後一行。每當處理一行時,把當前處理的行存儲在 臨時緩衝區,稱爲模式空間,接着用sed命令處理緩衝區中的內容,處理完後,把緩衝區的內容送往屏 幕。接着處理下一行,這樣不斷重複,直到文件末尾。

​ 經常使用選項

​ ♦ -n 不輸出模式空間內容到屏幕,即不自動打印

​ ♦ -e 多點編輯

​ ♦ -f FILE 從指定文件中讀取編輯腳本

​ ♦ -i。bak 備份文件並原處編輯

​ script格式:’地址命令‘

​ 地址格式

​ ♦ 不給地址:對全文進行處理

​ ♦ 單地址:

​ #:指定的行,$:最後一行

​ /pattern/:被此處模式所可以匹配到的每一行

​ ♦ 地址範圍:

​ #,# 從#行到第#行

​ #,+# 從#行到+#行

​ /pat1/,/pat2/

​ #,/pat/

​ ♦ 步進:~,1~2 奇數行,2~2 偶數行

​ 命令

​ ♦ p 打印當前模式空間內容,追加到默認輸出以後

​ ♦ Ip 忽略大小寫輸出

​ ♦ d 刪除模式空間匹配的行,並當即啓用下一輪循環

​ ♦ a [\\]text 在指定行後面追加文本,支持使用\n實現多行追加

​ ♦ i [\\]text 在行前面插入文本

​ ♦ c [\\]text 替換行爲單行或多行文本

​ ♦ w file 保存模式匹配的行至指定文件

​ ♦ r file 讀取指定文件的文本至模式空間中匹配到的行後

​ ♦ = 爲模式空間中的行打印行號

​ ♦ ! 模式空間中匹配行取反處理

​ ♦ s/pattern/string/修飾符 查找替換,支持使用其它分隔符,能夠是其它形式:s@@@,s###

​ 替換修飾符:

​ g 行內全局替換

​ p 顯示替換成功的行

​ w /PATH/FILE 將替換成功的行保存至文件中

​ I,i 忽略大小寫

#-a,向匹配行後追加
[root@centos82s ~]$cat test.txt 
dou123douo456dou789
13579dou
a246dou810
#方法一:指定行
[root@centos82s ~]$sed "2ahello" test.txt
dou123douo456dou789
13579dou
hello
a246dou810
#方法二:模糊匹配,可多行追加
[root@centos82s ~]$sed "/13579/ahello" test.txt 
dou123douo456dou789
13579dou
hello
a246dou810
#向最後一行追加
[root@centos82s ~]$sed '$ahello' test.txt 
dou123douo456dou789
13579dou
a246dou810
hello
#-i
[root@centos82s ~]$sed "2ihello" test.txt
dou123douo456dou789
hello
13579dou
a246dou810
[root@centos82s ~]$sed '/13/ihello' test.txt 
dou123douo456dou789
hello
13579dou
a246dou810
[root@centos82s ~]$sed '$ihello' test.txt 
dou123douo456dou789
13579dou
hello
a246dou810
#替換指定行
[root@centos82s ~]$sed '1chello' test.txt 
hello
13579dou
a246dou810
#替換匹配行
[root@centos82s ~]$sed '/dou/chello' test.txt 
hello
hello
hello
#替換最後一行
[root@centos82s ~]$sed '$chello' test.txt 
dou123douo456dou789
13579dou
hello
#刪除指定行
[root@centos82s ~]$sed '1d' test.txt 
13579dou
a246dou810
#刪除奇數行
[root@centos82s ~]$sed '1~2d' test.txt
13579dou
#刪除1到2行
[root@centos82s ~]$sed '1,2d' test.txt
a246dou810
#刪除1到2以外的行
[root@centos82s ~]$sed '1,2!d' test.txt
dou123douo456dou789
13579dou
#刪除最後一行
[root@centos82s ~]$sed '$d' test.txt
dou123douo456dou789
13579dou
#刪除模糊匹配行
[root@centos82s ~]$sed '/135/d' test.txt
dou123douo456dou789
a246dou810
#刪除匹配行到最後一行
[root@centos82s ~]$sed '/135/,$d' test.txt 
dou123douo456dou789
#刪除匹配行及其下面一行
[root@centos82s ~]$sed '/135/,+1d' test.txt 
dou123douo456dou789
#刪除空行
[root@centos82s ~]$sed '/^$/d' test.txt
dou123douo456dou789
13579dou
a246dou810
#刪除匹配行以外的行
[root@centos82s ~]$sed '/123\|135/!d' test.txt 
dou123douo456dou789
13579dou
#刪除指定行範圍內匹配的行
[root@centos82s ~]$sed '1,3{/123/d}' test.txt

13579dou
a246dou810
#替換文件中的內容,默認只替換行中匹配的第一個
[root@centos82s ~]$sed 's/dou/xiaobai/' test.txt
xiaobai123douo456dou789

13579xiaobai
a246xiaobai810
#替換內容,g,全局替換
[root@centos82s ~]$sed 's/dou/xiaobai/g' test.txt
xiaobai123xiaobaio456xiaobai789

13579xiaobai
a246xiaobai810
#將每行中匹配到內容的第二個替換
[root@centos82s ~]$sed 's/dou/xiaobai/2' test.txt
dou123xiaobaio456dou789

13579dou
a246dou810
#將每行匹配到內容的第二行替換,並將替換過的內容保存到文件
[root@centos82s ~]$sed -n 's/dou/xiaobai/2pw test1.txt' test.txt
dou123xiaobaio456dou789
#將每一行行首匹配到的內容替換爲空
[root@centos82s ~]$sed '/^#.*/s/#/''/' test.txt
dou123douo456,dou789
sds,%sdjsdo#@
,13579dou
,sakjdlsad
234cac2,46dou810
#將每一行行首匹配到的內容替換爲@
[root@centos82s ~]$sed '/^#.*/s/#/@/' test.txt
@dou123douo456,dou789
@sds,%sdjsdo#@
@,13579dou
,sakjdlsad
@234cac2,46dou810
#匹配行首爲#的行,替換,逗號後面的內容爲空
[root@centos82s ~]$sed '/^#.*/s/,.*//g' test.txt
#dou123d#ouo456
#sds
#
,sakjdlsad
#234ca#c2
#替換每行最後兩個字符爲空
[root@centos82s ~]$sed 's/..$//g' test.txt
#dou123d#ouo456,dou7
#sds,#%sdjsdo
#,13579d
,sakjdls
#234ca#c2,46dou八、
#將行首爲#的行替換爲空
[root@centos82s ~]$sed 's/^#.*//' test.txt

,sakjdlsad

#將行首爲#的替換爲空,而後刪除爲空的行
[root@centos82s ~]$sed 's/^#.*//;/^$/d' test.txt
,sakjdlsad

#將全部數字行首加上()
[root@centos82s ~]$cat test.txt 
1.#dou123d#ouo456,dou789
2.#sds,#%sdjsdo#@
3.#,13579dou
,sakjdlsad
4.#234ca#c2,46dou810
#方法一
[root@centos82s ~]$sed 's/^[0-9]/(&)/' test.txt
(1).#dou123d#ouo456,dou789
(2).#sds,#%sdjsdo#@
(3).#,13579dou
,sakjdlsad
(4).#234ca#c2,46dou810
#方法二
[root@centos82s ~]$sed 's/\([0-9]\)/(\1)/' test.txt 
(1).#dou123d#ouo456,dou789
(2).#sds,#%sdjsdo#@
(3).#,13579dou
,sakjdlsad
(4).#234ca#c2,46dou810
#在每一行行尾添加內容
[root@centos82s ~]$sed 's/$/& 'xiaobai'/' test.txt 
1.#dou123d#ouo456,dou789 xiaobai
2.#sds,#%sdjsdo#@ xiaobai
3.#,13579dou xiaobai
,sakjdlsad xiaobai
4.#234ca#c2,46dou810 xiaobai
#打印文件第三行內容
[root@centos82s ~]$sed -n '3p' test.txt
3.#,13579dou
#從第二行開始每隔二行打印一行
[root@centos82s ~]$sed -n '2~2p' test.txt
2.#sds,#%sdjsdo#@
,sakjdlsad
#打印第一行到第三行
[root@centos82s ~]$sed -n '1,3p' test.txt
1.#dou123d#ouo456,dou789
2.#sds,#%sdjsdo#@
3.#,13579dou
#打印最後一行
[root@centos82s ~]$sed -n '$p' test.txt 
4.#234ca#c2,46dou810
#打印第二行到最後一行
[root@centos82s ~]$sed -n '2,$p' test.txt 
2.#sds,#%sdjsdo#@
3.#,13579dou
,sakjdlsad
4.#234ca#c2,46dou810
#打印匹配到的行
[root@centos82s ~]$sed -n '/dou/p' test.txt 
1.#dou123d#ouo456,dou789
3.#,13579dou
4.#234ca#c2,46dou810
#打印從匹配s行匹配到dou的行
[root@centos82s ~]$sed -n '/s/,/dou/p' test.txt
2.#sds,#%sdjsdo#@
3.#,13579dou
,sakjdlsad
4.#234ca#c2,46dou810
#打印行號,和wc -l相似
[root@centos82s ~]$sed -n '$=' test.txt 
5
#打印匹配行的行號
[root@centos82s ~]$sed -n '/dou/=' test.txt 
1
3
5
#打印匹配行的行號和內容
[root@centos82s ~]$sed -n '/dou/{=;p}' test.txt 
1
1.#dou123d#ouo456,dou789
3
3.#,13579dou
5
4.#234ca#c2,46dou810
#將一個文件的內容讀取到另外一個文件,在另外一個文件的每一行追加顯示
[root@centos82s ~]$sed 'r test1.txt' test.txt
1.#dou123d#ouo456,dou789
dou123xiaobaio456dou789
2.#sds,#%sdjsdo#@
dou123xiaobaio456dou789
3.#,13579dou
dou123xiaobaio456dou789
,sakjdlsad
dou123xiaobaio456dou789
4.#234ca#c2,46dou810
dou123xiaobaio456dou789
#將一個文件內容讀取到另外一個文件的第三行後面追加顯示
[root@centos82s ~]$sed  '3r test1.txt' test.txt
1.#dou123d#ouo456,dou789
2.#sds,#%sdjsdo#@
3.#,13579dou
dou123xiaobaio456dou789
,sakjdlsad
4.#234ca#c2,46dou810
#將一個文件內容讀取到另外一個文件匹配內容行的後面追加顯示
[root@centos82s ~]$sed '/135/r test1.txt' test.txt 
1.#dou123d#ouo456,dou789
2.#sds,#%sdjsdo#@
3.#,13579dou
dou123xiaobaio456dou789
,sakjdlsad
4.#234ca#c2,46dou810
#將一個文件內容讀取到另外一個文件內容的最後一行
[root@centos82s ~]$sed '$r test1.txt' test.txt 
1.#dou123d#ouo456,dou789
2.#sds,#%sdjsdo#@
3.#,13579dou
,sakjdlsad
4.#234ca#c2,46dou810
dou123xiaobaio456dou789

#將一個test文件內容讀取到另外一個test1文件,文件不存在則建立,文件存在則覆蓋
[root@centos82s ~]$sed 'w test1.txt' test.txt
1.#dou123d#ouo456,dou789
2.#sds,#%sdjsdo#@
3.#,13579dou
dou123xiaobaio456dou789
,sakjdlsad
4.#234ca#c2,46dou810
#將文件test的第一行和最後一行寫入test1
[root@centos82s ~]$sed -n -e '1w test1.txt' -e '$w test1.txt' test.txt
[root@centos82s ~]$cat test1.txt 
1.#dou123d#ouo456,dou789
4.#234ca#c2,46dou810
#將test文件的第一行和第二行分別寫入test1和test2
[root@centos82s ~]$sed -n -e '1w test1.txt' -e '$w test2.txt' test.txt

13

正則表達式

正則表達式分爲兩類:

​ ♦ 基本正則表達式:BRE

​ ♦ 擴展正則表達式:ERE

​ 通常使用正則表達式用""將其包裹起來,避免特殊字符的影響

​ 正則表達式的元字符分類:字符匹配、匹配次數、位置錨定、分組和邏輯組合

13.1 字符匹配

​ 字符元字符列表

​ ♦ . 任意單個字符

​ ♦ [] 指定範圍內的字符,如[dou],表示匹配d,o,u這三個字符中的任何一個

​ ♦ [^] 排除[]中的字符,如[dou],表示匹配d,o,u 這個三個字符除外的任何一個

​ ♦ [:alnum:] 字母和數字

​ ♦ [:alpha:] 字母

​ ♦ [:lower:] 小寫字母

​ ♦ [:upper:] 大寫字母

​ ♦ [:blank:] 空格和tab

​ ♦ [:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)

​ ♦ [:digit:] 十進制數字,即0-9

​ ♦ [:xdigit:] 十六進制數字

​ ♦ [:cntrl:] 不可打印的控制字符(退格、刪除...)

​ ♦ [:graph:] 可打印的非空白字符

​ ♦ [:print:] 可打印的字符

​ ♦ [:punct:] 標點符號

#.匹配單個字符
[root@centos82s data]$grep "r..t" passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
#匹配文件中的數字
[root@centos82s data]$grep "[0-9]" 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
...
#過濾指定的字符
[root@centos82s data]$cat f1.txt
dou1
dou3
dou5
dou7
[root@centos82s data]$grep "dou[1-3]" f1.txt
dou1
dou3
#過濾指定的字符(取反)
[root@centos82s data]$grep "dou[^1-3]" f1.txt
dou5
dou7
13.2 次數匹配

​ 用在要指定次數的字符後面,表明字符要出現的次數

​ 次數匹配規則元字符

​ ♦ * 匹配前面字符N次,包括0次

​ ♦ \? 匹配前面字符0次或1次

​ ♦ \+ 匹配前面字符至少1次

​ ♦ \{n\} 匹配前面字符連續n次,n爲數字

​ ♦ \{m,n\} 匹配前面字符次數要大於等於m,小於等於n

​ ♦ \{m,} 匹配前面字符次數大於等於m

​ ♦ \{,n} 匹配前面字符次數小於等於n

[root@centos82s data]$cat f1.txt
dou111
dou333333
dou555555555
dou7
dou
#   *,匹配「1」任意次
[root@centos82s data]$grep "dou1*" f1.txt
dou111
dou333333
dou555555555
dou7
dou
#   \?,匹配1,0次或1次
[root@centos82s data]$grep "dou1\?" f1.txt
dou111
dou333333
dou555555555
dou7
dou
#   \+,至少匹配1,1次
[root@centos82s data]$grep "dou1\+" f1.txt
dou111
#   \{n\},匹配1,n次
[root@centos82s data]$grep "dou1\{4\}" f1.txt
[root@centos82s data]$grep "dou1\{2\}" f1.txt
dou111
#   \{m,n\},匹配1,大於等於3次,小於等於7次
[root@centos82s data]$grep "dou1\{3,7\}" f1.txt
dou111
#   \{m,\},匹配1,大於等於3次       
[root@centos82s data]$grep "dou1\{3,\}" f1.txt
dou111
[root@centos82s data]$grep "dou1\{4,\}" f1.txt
[root@centos82s data]$
13.3 位置錨定

​ 位置錨定能夠用於定位出現的位置

​ ♦ ^ 行首錨定,用於模式的最左側

​ ♦ $ 行尾錨定,用於模式的最右側

​ ♦ ^PATTERN$ 用於模式匹配整行

​ ♦ ^$ 空行

​ ♦ ^[[:space:]] 空白行

​ ♦ \< 或 \b 詞首錨定,用於單詞模式的左側

​ ♦ \> 或 \b 詞尾錨定,用於單詞模式的右側

​ ♦ \<PATTERN\> 匹配整個單詞

[root@centos82s data]$grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#查找以root爲行首的行
[root@centos82s data]$grep "^root" passwd
root:x:0:0:root:/root:/bin/bash
#查找非#開頭的行
[root@centos82s data]$grep "^[^#].*" fstab
UUID=5e437624-9610-4d5d-804b-ec9054e9f46d /                       xfs     defaults        0 0
UUID=e54fe5be-10b7-456b-b297-cf28faf5aab6 /boot                   ext4    defaults        1 2
UUID=7faf9f94-f218-4497-9fa2-030c11f8d577 /data                   xfs     defaults        0 0
UUID=9c230f26-8349-4153-b1d6-742a6a7b7088 swap                    swap    defaults        0 0
#查詢以bash結尾的行
[root@centos82s data]$grep "bash$" passwd
root:x:0:0:root:/root:/bin/bash
dou:x:1000:1000:dou:/home/dou:/bin/bash
admins:x:1001:1001::/home/admins:/bin/bash
honghong:x:1002:1002::/home/honghong:/bin/bash
lanlan:x:1003:1003::/home/lanlan:/bin/bash
#位置匹配行
[root@centos82s data]$grep "^dou111$" f1.txt
dou111
#詞首詞尾錨定
[root@centos82s data]$grep -n "\bdo" f1.txt
1:dou111
2:dou333333
3:dou555555555
4:dou7
5:dou
[root@centos82s data]$grep -n "\bdou1" f1.txt
1:dou111
[root@centos82s data]$grep -n "\<dou1" f1.txt
1:dou111
[root@centos82s data]$grep -n "1\b" f1.txt
1:dou111
[root@centos82s data]$grep -n "1\>" f1.txt
1:dou111
13.4 分組

​ ♦ () 分組

​ ♦ 後向引用:\1,\2,...

​ ♦ \| 或者

​ ♦ a\|b a或b

​ ♦ C\|cat C或cat

​ ♦ \(C\|c\)at Cat或cat

[root@centos82s data]$cat f1.txt
doudoudoudou
dououdououou
oudoudoudoud
#查看包含dou連續出現3次的行
[root@centos82s data]$grep "\(dou\)\{3\}" f1.txt
doudoudoudou
oudoudoudoud

[root@centos82s data]$cat f1.txt
cat
c
tomCat
Tom
dou
Cat
#查詢包含大寫C和cat的行
[root@centos82s data]$grep "C\|cat" f1.txt
cat
tomCat
Cat
#查詢Cat和cat的行
[root@centos82s data]$grep "\(C\|c\)at" f1.txt
cat
tomCat
Cat
[root@centos82s data]$grep "\(C\|c\)At" f1.txt
[root@centos82s data]$

14 擴展正則表達式

​ 去掉了普通正則表達式的"\"轉義字符

14.1 字符匹配元字符

​ ♦ . 任意單個字符

​ ♦ [] 指定範圍內的字符,如[dou],表示匹配d,o,u這三個字符中的任何一個

​ ♦ [^] 排除[]中的字符,如[dou],表示匹配d,o,u 這個三個字符除外的任何一個

​ ♦ [:alnum:] 字母和數字

​ ♦ [:alpha:] 字母

​ ♦ [:lower:] 小寫字母

​ ♦ [:upper:] 大寫字母

​ ♦ [:blank:] 空格和tab

​ ♦ [:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)

​ ♦ [:digit:] 十進制數字,即0-9

​ ♦ [:xdigit:] 十六進制數字

​ ♦ [:cntrl:] 不可打印的控制字符(退格、刪除...)

​ ♦ [:graph:] 可打印的非空白字符

​ ♦ [:print:] 可打印的字符

​ ♦ [:punct:] 標點符號

14.2 次數匹配

​ 用在要指定次數的字符後面,表明字符要出現的次數

​ 次數匹配規則元字符

​ ♦ * 匹配前面字符N次,包括0次

​ ♦ ? 匹配前面字符0次或1次

​ ♦ + 匹配前面字符至少1次

​ ♦ {n} 匹配前面字符連續n次,n爲數字

​ ♦ {m,n} 匹配前面字符次數要大於等於m,小於等於n

14.3 位置錨定

​ ♦ ^ 行首錨定,用於模式的最左側

​ ♦ $ 行尾錨定,用於模式的最右側

​ ♦ \< 或 \b 詞首錨定,用於單詞模式的左側

​ ♦ \> 或 \b 詞尾錨定,用於單詞模式的右側

14.4 分組其它

​ ♦ () 分組

​ ♦ 後向引用:\1,\2,...

​ ♦ | 或者

​ ♦ a|b a或b

​ ♦ C|cat C或cat

​ ♦ (C|c)at Cat或cat

15 shell腳本編程

15.1 shell腳本語言基本語法
15.1.1 第一個腳本
[root@centos82s data]$vim hello.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-07
#FileName:                  hello.sh                                              
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#經典寫法
echo "hello,world"
#流行寫法
echo "Hello,world!"

#執行方法1
[root@centos82s data]$bash hello.sh
hello,world
Hello,world!
#執行方法2
[root@centos82s data]$cat hello.sh|bash
hello,world
Hello,world!
#執行方法3
[root@centos82s data]$bash < hello.sh
hello,world
Hello,world!
#執行方法4,指定執行權限給hello.sh
[root@centos82s data]$/data/hello.sh
-bash: /data/hello.sh: Permission denied
[root@centos82s data]$chmod +x hello.sh
[root@centos82s data]$/data/hello.sh    #絕對路徑
hello,world
Hello,world!
[root@centos82s data]$./hello.sh    #相對路徑
hello,world
Hello,world!
#執行方法5,本方法能夠實現執行遠程主機的shell腳本
[root@centos82s ~]$cp /data/hello.sh /var/www/html
[root@centos82s ~]$curl http://10.0.0.115/hello.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-07
#FileName:                  hello.sh
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#經典寫法
echo "hello,world"
#流行寫法
eco "Hello,world!"

echo "哈嘍我怎麼顯示了呢"
15.1.2 腳本調試

​ 只檢測腳本中的語法錯誤,但沒法檢查出命令錯誤,不真正執行腳本

[root@centos82s data]$cat hello.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-07
#FileName:                  hello.sh
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#經典寫法
echo "hello,world       #缺乏"
#流行寫法
echo "Hello,world!"

#-n,語法錯誤,命令不繼續執行
[root@centos82s data]$bash -n hello.sh
hello.sh: line 16: unexpected EOF while looking for matching `"'
hello.sh: line 17: syntax error: unexpected end of file
#命令錯誤,命令繼續執行
[root@centos82s data]$./hello.sh
hello,world
./hello.sh: line 16: eco: command not found
哈嘍我怎麼顯示了呢
#-x,檢查出錯的命令
[root@centos82s data]$bash -x hello.sh
+ echo hello,world
hello,world
+ eco 'Hello,world!'
hello.sh: line 16: eco: command not found
+ echo 哈嘍我怎麼顯示了呢
哈嘍我怎麼顯示了呢

總結:腳本常見錯誤有三種

​ ♦ 語法錯誤,會致使後續的命令不繼續執行,能夠用bash -n檢查錯誤,提示的出錯行數不必定準確

​ ♦ 命令錯誤,默認後續的命令還繼續執行,用bash -n 沒法檢查出來,可使用bash -x 進行觀察

​ ♦ 邏輯錯誤,只能使用 bash -x 進行觀察

15.2 變量
15.2.1 變量介紹

​ 變量表示命名的內存空間,將數據放在內存空間中,經過變量名引用獲取數據

15.2.2 變量類型

​ 變量類型:

​ ♦ 內置變量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,$?,HISTSIZE

​ ♦ 用戶自定義變量

​ 變量數據類型:

​ ♦ 字符

​ ♦ 數值:整型、浮點型、bash不支持浮點數

15.2.3 shell中變量命名規則

​ ♦ 不能使用程序中的保留字和內置變量

​ ♦ 只能使用數字、字母、下劃線,且不能以數字開頭,不支持「-」

​ ♦ 統一命名規則:駝峯命名,studentname,大駝峯,StudengName,小駝峯,studentName

​ ♦ 變量名大寫

​ ♦ 局部變量小寫

、 ♦ 函數名小寫

15.2.4 變量定義和引用

​ 標準劃分變量類型的生效範圍

​ ♦ 普通變量:生效範圍爲當前shell進程;對當前shell以外的其它shell進程和其子shell進程均無效

​ ♦ 環境變量:生效範圍爲當前shell進程及其子進程

​ ♦ 本地變量:生效範圍爲當前shell進程中的某代碼片斷,一般指函數

​ 變量賦值:

​ 直接字符串: name="root"

​ 變量引用: name="$USER"

​ 命令引用: name=`COMMAND`` 或者 name=$(COMMADN)

​ 注意:變量賦值是臨時生效,退出終端後,變量會自動刪除,腳本中的變量會隨着腳本結束

​ 變量引用:$name 或 ${name}

​ 弱引用和強引用

​ ♦ "$name" 弱引用,其中變量會被替換爲變量值

​ ♦ '$name' 強引用,變量不會替換爲變量值,保持原字符串

#賦值字符串
[root@centos82s ~]$NAME="小白"
[root@centos82s ~]$echo $NAME
小白
[root@centos82s ~]$echo hello $NAME
hello 小白
[root@centos82s ~]$echo "hello,$NAME"
hello,小白
[root@centos82s ~]$echo 'hello,$NAME'
hello,$NAME
#變量引用
[root@centos82s ~]$USERNAME="$NAME"
[root@centos82s ~]$echo $USERNAME
小白
#給變量賦值命令
[root@centos82s ~]$HOST=`hostname`
[root@centos82s ~]$echo $HOST
centos82s
#顯示定義的全部變量
HOST=centos82s
NAME=小白
USERNAME=小白
#刪除變量
[root@centos82s ~]$unset USERNAME
15.2.5 環境變量

​ ♦ 可使子進程或子子進程繼承父進程的變量,但父進程沒法使用子進程變量

​ ♦ 子進程修改從父進程繼承的變量,新的值會傳遞給子子進程

​ ♦ 通常使用在系統配置文件,腳本中不多使用

#聲明並賦值
[root@centos82s ~]$export name=小白
[root@centos82s ~]$echo $name
小白
[root@centos82s ~]$declare -x name=小黑
[root@centos82s ~]$echo $name
小黑
#先賦值,後設置爲環境變量
[root@centos82s ~]$name=小分
[root@centos82s ~]$export name
[root@centos82s ~]$echo $name
小分
#顯示全部環境變量
[root@centos82s ~]$env
[root@centos82s ~]$printenv
[root@centos82s ~]$export
[root@centos82s ~]$declare -x
#刪除變量
[root@centos82s ~]$unset name

​ bash內建的環境變量

[root@centos82s ~]$echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos82s ~]$echo $SHELL
/bin/bash
[root@centos82s ~]$echo $USER
root
[root@centos82s ~]$echo $UID
0
[root@centos82s ~]$echo $HOME
/root
[root@centos82s ~]$echo $PWD
/root
[root@centos82s ~]$echo $SHLVL
1
[root@centos82s ~]$echo $LANG
en_US.UTF-8
[root@centos82s ~]$echo $MAIL
/var/spool/mail/root
[root@centos82s ~]$echo $HOSTNAME
centos82s
[root@centos82s ~]$echo $HISTSIZE
1000
15.2.6 只讀變量

​ 只讀變量:只能聲明定義,後續不能修改和刪除,即常量

#聲明變量並賦值
[root@centos82s ~]$readonly name="小明"
[root@centos82s ~]$declare -r age="20"
#不能修改和刪除
[root@centos82s ~]$name="小黑"
-bash: name: readonly variable
[root@centos82s ~]$unset name
-bash: unset: name: cannot unset: readonly variable
15.2.7 位置變量

​ 位置變量:在bash shell中內置的變量,在腳本代碼中調用經過命令行傳遞給腳本的參數

​ ♦ $0 命令自己,包括路徑

​ ♦ $1,$2... 對應第一個,第二個參數,shint [n]換位置

​ ♦ $* 傳遞給腳本的全部參數,全部參數合併爲一個字符串

​ ♦ $@ 傳遞給腳本的全部參數,每一個參數爲獨立字符串

​ ♦ $# 傳遞給腳本的參數個數

​ 注意:$@ ,$* 只在被雙引號包裹起來的時候纔有差別

​ ♦ set -- 清空全部位置變量

[root@centos82s data]$cat wz.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-08
#FileName:                  wz.sh
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#內置變量
echo "1var is $1"
echo "2var is $2"
echo "3var is $3"
echo "10var is ${10}"
echo "11var is ${11}"

echo "The number of vaer is $#"
echo "All vars are $*"
echo "All vars are $@"
echo "The scriptname is `basename $0`"

[root@centos82s data]$bash wz.sh {a..z}
1var is a
2var is b
3var is c
10var is j
11var is k
The number of vaer is 26
All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z
All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z
The scriptname is wz.sh
[root@centos82s data]$bash < . wz.sh {a..z}
1var is a
2var is b
3var is c
10var is j
11var is k
The number of vaer is 26
All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z
All vars are a b c d e f g h i j k l m n o p q r s t u v w x y z
The scriptname is wz.sh
#$*和$@的區別
[root@centos82s data]$cat f1.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-08
#FileName:                  f1.sh
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#
echo "f1.sh:all args are $@"
echo "f1.sh:all args are $*"
bash file.sh "$*"
[root@centos82s data]$cat f2.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-08
#FileName:                  f2.sh
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#
echo "f2.sh:all args are $@"
echo "f2.sh.all args are $*"

bash file.sh "$@"
[root@centos82s data]$cat file.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-08
#FileName:                  file.sh
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#
echo "file.sh:1st arg is $1"
[root@centos82s data]$bash f1.sh a b c
f1.sh:all args are a b c
f1.sh:all args are a b c
file.sh:1st arg is a b c    #把全部參數合併做爲一個字符串
[root@centos82s data]$bash f2.sh a b c
f2.sh:all args are a b c
f2.sh.all args are a b c
file.sh:1st arg is a        #仍是獨立的字符串參數
15.2.8 利用軟鏈接實現同一個腳本不一樣功能
#建立一個腳本,輸出信息爲命令自己包括路徑
[root@centos82s data]$cat lin.sh
#!/bin/bash
#
#*************************************************************************
#Author:                    dadoudou
#QQ:                        
#Date:                      2020-08-08
#FileName:                  lin.sh
#URL:                       
#Description:               The test script
#Copyright (C)              2020All rights reserved
#*************************************************************************
#
#
echo $0
#指定lin.sh文件的兩個軟鏈接
[root@centos82s data]$ln -s lin.sh lina.sh
[root@centos82s data]$ln -s lin.sh linb.sh
#同一文件的軟鏈接,執行的腳本相同,能夠實現不一樣的功能
[root@centos82s data]$bash lina.sh
lina.sh
[root@centos82s data]$bash linb.sh
linb.sh

​ 15.2.9 退出狀態碼

​ 瀏覽網頁時會有表示網頁錯誤信息的數字,稱爲狀態碼,在shell腳本中也有相應狀態,進程執行 後,將使用變量$?保存執行後狀態碼的相關數字,不一樣的值反應成功或失敗,$?取值0-255

​ ♦ 腳本中遇到exit命令,腳本會當即終止;終止退出狀態碼取決於exit命令後面的數字,可本身定義

​ ♦ 若是沒有給腳本指定退出狀態碼,狀態碼取決於最後一條命令的狀態碼

​ ♦ $?=0 #表明成功

​ ♦ $?=[1-255] #表明失敗

[root@centos82s data]$echo $?
0
[root@centos82s data]$hostnamee
-bash: hostnamee: command not found
[root@centos82s data]$echo $?
127
相關文章
相關標籤/搜索