正則表達式(正則表達式匹配的是文本內容中的字符串,通倍符匹配的是文件名)
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)
不表示字符字面意義,而表示控制或通配的功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等
分兩類:不同的命令支持不同的正則表達式
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep
正則表達式引擎:
采用不同算法,檢查處理正則表達式的軟件模塊
PCRE(Perl Compatible Regular Expressions)
元字符分類:字符匹配、匹配次數、位置錨定、分組
man 7 regex
字符匹配:
. 匹配任意單個字符?? 漢字也算一個字符? 特例:.在中括號里面就代表.本身,不代表單個任意字符,.在中括號里面都不需要轉義
[] 匹配指定范圍內的任意單個字符? “或”的關系
[^] 匹配指定范圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴…)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
例:
echo abc | grep a.c?? 輸出顯示abc
echo abbc | grep a..c 輸出顯示abbc
ls | grep …?? 顯示的是任意三個字符的文件,grep默認是貪婪模式,從頭三個三個匹配到尾,不夠的就停下來了
echo a.b | grep -w “.\..”? 顯示的是a.b 原因是\.是轉義的,\.就是代表.本身
echo abcdef | grep “a[abc]c”? 意思有如果有aac或者abc或者acc均會顯示出來整行,所以輸出abcdef
如果echo abcdef | grep “a[xyz]c”則不顯示
echo abcedf | grep “a[^xyz]c”意思是除了xyz以外任意一個字符與ac匹配,所以顯示abcdef
ls | grep?? ls命令的結果通過管道傳給grep,grep將其作為字符串進行處理
匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數
* 匹配*前面的字符任意次,包括0次
貪婪模式:盡可能長的匹配
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
例
echo ab|grep “ax*b”?? 顯示ab,x*的意思是x出現的次數為任意次,可以是0次
echo abb|grep “ax*b” 符合,后面的b相當于多余的
echo abccdd | grep “a[a-z]\?c”? 意思是\?之前的[a-z]出現0次或1次,標紅的是abc
grep “[a-z]\+”? 意思是a-z小寫字母至少出現一次?? kjaakhd符合條件
grep “[a-z.]\+”例外:在中括號里面的.就是.本身,不代表單個任意字符,意思是a-z或.至少出現一次的都符合
centos7地址是:??????? inet 192.168.30.135? netmask 255.255.255.0? broadcast 192.168.30.255? 將192.168.30.135取出來
ifconfig ens33 | grep -o “[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}”| head -n 1
或則ifconfig ens33|grep -o “[0-9.]\{7,\}”|head -n1? 這種寫法不太嚴謹
或者ifconfig ens33|grep -o “inet [0-9.]\+”|cut -d” ” -f2
centos6上是ifconfig eth0|grep -o “addr:[0-9.]\+”|cut -d”:” -f2
df | grep sd | grep -o “[0-9]\{1,3\}%”|grep -o “[0-9]\+”|sort -nr|head -n1?? 取分區利用率最大的
位置錨定:定位出現的位置
^行首錨定,用于模式的最左側
$行尾錨定,用于模式的最右側
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用于單詞模式的左側??? 單詞包括子母數字下劃線屬于一個單詞,其他符號都不屬于一個單詞
\> 或 \b 詞尾錨定;用于單詞模式的右側
\<PATTERN\> 匹配整個單詞
例:
grep “^root” /etc/passwd 意思是要過濾出以root開頭的行
grep “bash$” /etc/passwd 意思是要過濾出以bash結尾的行
grep -v “^[[:space:]]*$”? 過濾空行,只顯示非空的行
grep “\<root” /etc/passwd? 過濾出以root為單詞詞首的行,只要root為單詞詞首就會顯示,顯示如下
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
例:
grep “root\>” /etc/passwd 過濾出以root為單詞詞尾的行,顯示如下
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
例:
grep “\<root\>” /etc/passwd? 過濾出只以root為單詞的行,等價于grep -w “root” /etc/passwd
分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:
\(root\)\+
分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這
些變量的命名方式為: \1, \2, \3, …
\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
示例: \(string1\+\(string2\)*\)
\1 :string1\+\(string2\)*
\2 :string2
后向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
或者:\|
示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
例:
grep “wang\{3\}”? 過濾出g這個字母三次,不是wang這個字符串三次
grep “\(wang\)\{3\}” 過濾出wang這個字符串三次
echo wangwangwangxxxwangwangwang | grep “\(wang\)\{3\}.*\1”? \1意思是調用wang這個字符串三次
顯示wangwangwangxxxwangwangwang
echo wangwangwangxxxmagemagewangwangwangmage | grep “\(wang\)\+.*\(mage\)\{1,\}\1.*\2”
等價于echo wangwangwangxxxmagemagewangwangwangmage | grep “\(wang\)\+.*\(mage\)\+\1.*\2”
顯示wangwangwangxxxmagemagewangwangwangmage? 意思是\1調用至少出現一次的wang,\2代表調用至少出現一次的mage
echo wangwangwangmagemagemagedjfshkfhwangwangwangmagemagemage | grep “\(wang\)\+.*\(mage\)\+.*\1.*\2.*”
顯示wangwangwangmagemagemagedjfshkfhwangwangwangmagemagemage
注意:
echo rootxxrbbt | grep “\(r..t\).*\1”? rootxxrbbt不符合
原因是:\1代表(r..t)最終匹配的結果,(r..t)匹配到的是root,所以\1代表的是(r..t)最終匹配的結果root,而不是(r..t)
grep “^\(.*\):.*/\1$” /etc/passwd? 過濾出passwd文件中以什么開頭就以什么結尾的行,以:之前為頭,以/為結尾
grep “^a\|^b.*” /etc/passwd 意思是以a開頭或者以(b.*)開頭
如果想表示以a開頭或者以b開頭,則grep “^\(a\|b\).*” /etc/passwd
grep “a\|bxy”????? 表示的是a或者bxy
grep “\(a\|b\)xy”?? 表示的是axy或者bxy
grep -o “[0-9]\+[.]” /etc/centos-release | grep -o “[0-9]\+”? 取centos版本號
grep -o “[0-9]\+” /etc/centos-release | grep -o “[0-9]\+”? 與上面的等價
grep -o “[0-9]\+” /etc/centos-release | head -n1????????? 與上面的等價
egrep及擴展的正則表達式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE…]
擴展正則表達式的元字符:
字符匹配:
. 任意單個字符
[] 指定范圍的字符
[^] 不在指定范圍的字符
次數匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置錨定:
^ :行首
$ :行尾
\<, \b :語首
\>, \b :語尾
分組:
()
后向引用:\1, \2, …
或者:
a|b: a或b
C|cat: C或cat
(C|c)at:Cat或cat
vim簡介
vi: Visual Interface,文本編輯器
文本:ASCII, Unicode
文本編輯種類:
行編輯器: sed
全屏編輯器:nano, vi
vim – Vi Improved
其他編輯器:
gedit 一個簡單的圖形編輯器
gvim 一個 Vim 編輯器的圖形版本
打開文件
# vim? [OPTION]… FILE…
+#: 打開文件后,讓光標處于第#行的行首,+默認行尾? vim +5 /etc/passwd
+/PATTERN :打開文件后,直接讓光標處于第一個被 PATTERN 匹配到的行的行首
vim + /^rpc /etc/passwd?? rpc為行首
–b file 二進制方式打開文件
–d file1 file2… 比較多個文件
-m file 只讀打開文件
ex file 或 vim –e 直接進入ex模式
如果該文件存在,文件被打開并顯示內容
如果該文件不存在,當編輯后第一次存盤時創建它
vim:一個模式編輯器
擊鍵行為是依賴于 vim的 的“模式”
三種主要模式:
命令(Normal)模式:默認模式,移動光標,剪切/粘貼文本
插入(Insert)或編輯模式: 修改文本
擴展命令(extended command )模式: 保存,退出等
Esc鍵 退出當前模式
Esc鍵 Esc鍵 總是返回到命令模式
模式轉換
命令模式 –> 插入模式
i: insert, 在光標所在處輸入
I:在當前光標所在行的行首輸入
a: append, 在光標所在處后面輸入
A:在當前光標所在行的行尾輸入
o: 在當前光標所在行的下方打開一個新行
O:在當前光標所在行的上方打開一個新行
插入模式 ——–> 命令模式
ESC
命令模式 ——–> 擴展命令模式
:
擴展命令模式 ——–> 命令模式
ESC
關閉文件
擴展模式:
:q? 退出 (沒有改過的情況下)
:q!? 強制退出,丟棄做出的修改
:wq? 保存退出
:x? 保存退出
:w /data/f2? 將修改完的另存為data目下的f2,如果原來有f2,想覆蓋原f2內容則
:w! /data/f2
:r another?? 可以將另外的文件內容讀到當前文件中,如:r f2 將f2的內容讀到當前文件中
命令模式
ZZ: 保存退出(不建議用)
ZQ:不保存退出(不建議用)
擴展模式
按“:”進入Ex模式
創建一個命令提示符: 處于底部的屏幕左側
命令:
w 寫(存)磁盤文件
wq 寫入并退出
q 退出
q!不存盤退出,即使更改都將丟失
r filename? 讀文件內容到當前文件中
w filename 將當前文件內容寫入另一個文件
!command 執行命令
r!command 讀入命令的輸出
例:r!ls /boot/initramfs-0-rescue-adc241255b124d4095b8532193d518a1.img? 支持tab鍵補全,直接將/boot/initramfs-0-rescue-adc241255b124d4095b8532193d518a1.img插入到當前內容
echo -e “\e[1;31m123\e[0m”? 將123變成高亮紅色
在vim插入模式下輸入\e的方法:按住ctrl+v+[
在vim模式下輸入帶顏色的字的方法:在vim插入模式下插入\e[1;31mliu\e[0m??? 查看文件是liu是紅色的,如果是很多的內容都要變顏色,就在內容頭部打\e[1;31m 尾部打\e[0m
命令模式光標跳轉
字符間跳轉:
h: 左 l: 右 j: 下? k: 上
#COMMAND:跳轉由#指定的個數的字符?? 例:3h 向左移三個字符
單詞間跳轉:
w:下一個單詞的詞首? 3w? 跳動三個單詞
e:當前或下一單詞的詞尾
b:當前或前一個單詞的詞首
#COMMAND :由#指定一次跳轉的單詞數
當前頁跳轉:
H:頁首 M:頁中間行 L:頁底
命令模式光標跳轉
行首行尾跳轉:
^: 跳轉至行首的第一個非空白字符
0: 跳轉至行首
$: 跳轉至行尾
行間移動:
#G、擴展模式:# :跳轉至由#指定行
G:最后一行
1G, gg: 第一行
句間移動:以.和空格算一句,空行也算一句
):下一句? (:上一句
段落間移動:空行算段落
}:下一段? {:上一段
命令模式翻屏操作
Ctrl+f: 向文件尾部翻一屏
Ctrl+b: 向文件首部翻一屏
Ctrl+d: 向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
命令模式操作
字符編輯:
x: 剪切光標處的字符
X:剪切光標前一個字符
#x: 剪切光標處起始的#個字符
p:在光標位置處后面粘貼
xp: 交換光標所在處的字符及其后面字符的位置
~:轉換當前行大小寫
J:刪除當前行后的換行符(意思是將換行符隔開的兩行換成一行)
替換命令(r, replace)
r: 替換光標所在處的字符
R:切換成REPLACE模式,替換多個字符
刪除命令:
d: 刪除命令,可結合光標跳轉字符,實現范圍刪除
d$: 刪除到行尾
d^:刪除到非空行首
d0:刪除光標處到行首,不包括光標處
dw: 2dw? 刪除光標處往后兩個單詞
de:
db:
#COMMAND
dd: 刪除光標所在的行
#dd:多行刪除
D:從當前光標位置一直刪除到行尾,留空行,等同于d$
復制命令(y, yank):
y: 復制,行為相似于d命令
y$
y0
y^
ye
yw
yb
#COMMAND
yy:復制行
#yy: 復制多行
Y: 復制整行
粘貼命令(p, paste):
p:緩沖區存的如果為整行,則粘貼當前光標所在行的下方;否則,則粘貼
至當前光標所在處的后面
P:緩沖區存的如果為整行,則粘貼當前光標所在行的上方;否則,則粘貼
至當前光標所在處的前面
改變命令(c, change)
c: 修改后切換成插入模式
命令模式 –> 插入模式
c$ 從當前光標處刪到當前行尾并進入插入模式
c^
c0
cb
ce
cw
#COMMAND
cc:刪除當前行并輸入新內容,相當于S
#cc:
C:刪除當前光標到行尾,并切換成插入模式
100iwang [ESC] 粘貼“wang”100次
<start position><command><end position>
Command:
y 復制、d 刪除、gU 變大寫、gu 變小寫
例如 0y$ 命令意味著:
0 → 先到行頭
y → 從這里開始拷貝
$ → 拷貝到本行最后一個字符
ye 從當前位置拷貝到本單詞的最后一個字符
擴展命令模式:地址定界
地址定界
:start_pos,end_pos
# 具體第#行,例如2表示第2行
#,# 從左側#表示起始行,到右側#表示結尾行
#,+# 從左側#表示的起始行,加上右側#表示的行數
:2,+3 表示2到5行
. 當前行
$ 整個內容的最后一行
.,$-1 當前行到倒數第二行
% 全文, 相當于1,$
/pat1/,/pat2/
從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束
例如:/^r/,/^b/d 意思是將以r開頭的到以b開頭的刪除
#,/pat/
/pat/,$
使用方式:后跟一個編輯命令
d
y
w file: 將范圍內的行另存至指定文件中
r file:在指定位置插入指定文件中的所有內容
擴展命令模式:查找
查找
/PATTERN:從當前光標所在處向文件尾部查找
?PATTERN:從當前光標所在處向文件首部查找
n:與命令同方向
N:與命令反方向
擴展命令模式:查找并替換
s: 在擴展模式下完成查找替換操作
格式:s/要查找的內容/替換為的內容/修飾符
要查找的內容:可使用模式
替換為的內容:不能使用模式,但可以使用\1, \2, …等后向引用符號;還可
以使用“&”引用前面查找時查找到的整個內容
如將全部haha替換為hahaer? :%s/\(haha\)/\1er/g?? \1表示\(haha\)
修飾符:
i: 忽略大小寫
g: 全局替換;默認情況下,每一行只替換第一次出現
gc:全局替換,每次替換前詢問
查找替換中的分隔符/可替換為其它字符,例如
s@/etc@/var@g
s#/boot#/#i
例:1,10s/bash/csh/?? 意思是1-10行搜索bash并將bash替換為csh,默認情況下每一行只替換第一次出現
1,10s/bash/csh/g?? 意思是從1-10行全局搜索并將bash替換為csh
例;將第二行的/bin替換為/usr/bin?? 2s/\/bin/\/usr\/bin? 需要將/轉義下,即\/
例:%s/^UUID/#&/? 意思是全文搜索,將UUID開頭的行替換為#UUID。&的意思是前面搜索出來的所有字符
命令模式:撤消更改
u撤銷最近的更改
#u撤銷之前多次更改
U 撤消光標落在這行后所有此行的更改(前提是光標沒有離開過此行)
按Ctrl + r重做最后的“撤消”更改(即回撤)
. 重復前一個操作
n.重復前一個操作n次
vim的寄存器
有26個命名寄存器和1個無命名寄存器,常存放不同的剪貼版內容,可以不同會話間
共享
寄存器名稱a,b,…,z,格式:“寄存器 放在數字和命令之間
如:3″tyy 表示復制3行到t寄存器中
“tp 表示將t寄存器內容粘貼?? 默認貼到光標的下一行
未指定,將使用無命名寄存器
有10個數字寄存器,用0,1,…,9表示,0存放最近復制內容,1存放最近刪除內容。
當新的文本變更和刪除時,1轉存到2,2轉存到3,以此類推。數字寄存器不能在不
同會話間共享
編輯二進制文件(了解)
以二進制方式打開文件
vim –b binaryfile
擴展命令模式下,利用xxd命令轉換為可讀的十六進制
:%!xxd
編輯二進制文件
擴展命令模式下,利用xxd命令轉換回二進制
:%!xxd –r
保存退出
可視化模式
允許選擇的文本塊
v 面向字符
V 面向行
ctrl-v? 面向塊
可視化鍵可用于與移動鍵結合使用:
w ) } 箭頭等
突出顯示的文字可被刪除,復制,變更,過濾,搜索,替換等
多文件模式
vim FILE1 FILE2 FILE3 …
:next 下一個
:prev 前一個
:first 第一個
:last 最后一個
:wall 保存所有
:qall 退出所有
:wqall
使用多個“窗口”
多文件分割
vim -o|-O FILE1 FILE2 …
-o: 水平分割?? Ctrl+w+jk鍵進行上下切換
-O: 垂直分割?? Ctrl+w+hl鍵進行左右切換
在窗口間切換: Ctrl+w, Arrow
單文件窗口分割:
Ctrl+w,s: split, 水平分割
Ctrl+w,v: vertical, 垂直分割
ctrl+w,q:取消相鄰窗口
ctrl+w,o:取消全部窗口
:wqall 退出
定制vim的工作特性
配置文件:永久有效
全局:/etc/vimrc
個人:~/.vimrc
擴展模式:當前vim進程有效
(1) 行號
顯示:set number, 簡寫為set nu
取消顯示:set nonumber, 簡寫為set nonu
(2) 忽略字符的大小寫
啟用:set ic
不忽略:set noic
(3) 自動縮進
啟用:set ai
禁用:set noai
(4) 智能縮進
啟用:smartindent 簡寫 set si
禁用:set nosi
(5) 高亮搜索
啟用:set hlsearch
禁用:set nohlsearch
(6) 語法高亮
啟用:syntax on
禁用:syntax off
(7) 顯示Tab和換行符 ^I 和$顯示
啟用:set list
禁用:set nolist
(8)文件格式
啟用windows格式:set fileformat=dos
啟用unix格式:set fileformat=unix
簡寫: set ff=dos|unix
(9) 設置文本寬度
啟用: set textwidth=65 (vim only)
禁用: set wrapmargin=15
(10) 設置光標所在行的標識線
啟用:set cursorline,簡寫cul
禁用:set no cursorline
(11) 復制保留格式
啟用: set paste
禁用: set nopaste
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95444