1、grep
grep
–color=auto: 對匹配到的文本著色顯示
-v: 顯示不被pattern匹配到的行
-i: 忽略字符大小寫
-n:顯示匹配的行號
-c: 統計匹配的行數
-o: 僅顯示匹配到的字符串
-q: 靜默模式,不輸出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:實現多個選項間的邏輯or關系
grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整個單詞
-E:使用ERE
-F:相當于fgrep,不支持正則表達式
元字符分類:字符匹配、匹配次數、位置錨定、分組
字符匹配:
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴…)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數
* 匹配前面的字符任意次,包括0次
貪婪模式:盡可能長的匹配
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
位置錨定:定位出現的位置
^ 行首錨定,用于模式的最左側
$ 行尾錨定,用于模式的最右側
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用于單詞模式的左側
\> 或 \b 詞尾錨定;用于單詞模式的右側
\<PATTERN\> 匹配整個單詞
分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:
\(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 -q? 輸出值在變量 $??????? echo $???? 0表示 1表示不匹配
顯示匹配后的再后三行一起顯示
grep -nA3 root /etc/passwd
顯示匹配后的前三行一起顯示
grep -nB3 root /etc/passwd
同時顯示匹配后的前后三行一起顯示
grep -nC3 root /etc/passwd
nmap -v -sP 172.20.108.0/24 |grep -B1 “host is up”
cat nmap.log |grep report |cut -d ” ” -f5
grep -e 或者關系
grep -e root -e bash /etc/passwd? 或者關系
grep root /etc/passwd |grep bash 并且關系
echo xabcy |grep -w abc
echo “x abc y” | grep -w abc
echo “x_abc_y” | grep -w abc
結果為空
echo “x abc y” | grep -w abc
echo “x,abc,y” | grep -w abc
echo “x-abc-y” | grep -w abc
結果為abc
文件列表,內容為pattern的列表,里面是或者關系:
grep -f
通配符匹配的是文件名,而不能處理文本內容
2、正則表達式
正則表達式則是處理文本內容里面的特定字符或者內容
正則表達式引擎
強大的Perl語言軟件模塊 PCRE 正在沒落原因太靈活不容易看懂
主流python
元字符分類: 字符匹配 匹配次數 位置錨定 分組
幫助文檔
man 7
.匹配任意的單一字符,而不是字節
echo abc|grep a.c
貪婪模式
ls |grep …
ls |grep -w ‘…’
.\..
轉義\.讓.回歸到本身的含義
*含義x* x出現0次或者n次 而且貪婪模式 x xx xxx ..
echo axb |grep “ax*b”? 正則表達獨立的都加雙引號不然容易出錯
.*任意長度的任意字符!!!!!
b.txt
ls |grep “.*\.txt”
ls *.txt
echo abccdd |grep “a[a-z]*c” 貪婪模式
abcc
echo abccdd |grep “a[a-z]\?c” 懶惰模式
abc
echo “1.” |grep “[a-z.]\+”
.在中括號里面等于轉義,表示.本身
截取ifconfig ens33 里面的ip地址
ifconfig ens33 |grep -o “[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}”|head -n1
截取df中占用率最高的那個數據
df | grep “/dev/sd”| grep -o “[0-9]\{1,3\}%”|grep -o “[0-9]\+”|sort -nr|head -n1
位置錨定
行首錨定 ^
grep “^boot” /etc/passwd
行尾錨定
grep “bash$” /etc/passwd
分組
1.
echo? wangwangwangxxxxmagemagewangwangwangmagemagemage | grep “\(wan\)\{3\}.*\
(mage\)\+\1.*\2”
wangwangwangxxxxmagemagewangwangwangmagemagemage
2.
echo rootxxrbbt | grep ‘\(r..t\).*\1’
結果為不匹配,因為\1不是匹配\(\)的模式而是匹配\(\)里面的結果,而r..t結果已經被固定為root,所有\1匹
配的還是root,所以不符合。
后向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
3.抽取/etc/passwd中首尾為相同名稱的行
grep “^\(.*\):.*/\1$” /etc/passwd
4.\| 表示或者
顯示出a或者b開頭的行 /etc/passwd
grep “^\(a\|b\).*” /etc/passwd
echo axy | grep “a\|bxy”
表示的是a或者bxy
echo axy | grep “\(a\|b\)xy”
表示的是axy或者bxy
5.用grep命令提取cat /etc/centos-release 中的版本號首位數字
cat /etc/centos-release|grep -o “[0-9]\+”|head -n1
練習
1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)
2、顯示/etc/passwd文件中不以/bin/bash結尾的行
3、顯示用戶rpc默認的shell程序
4、找出/etc/passwd中的兩位或三位數
5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面有非空白字符的行
6、找出“ netstat -tan” 命令結果中以LISTEN后跟任意多個空白字符結尾的行
7、顯示CentOS7上所有系統用戶的用戶名和UID
8、添加用戶bash、 testbash、 basher、 sh、 nologin(其shell為/sbin/nologin),找出/etc/passwd用戶名和
shell同名的行
9、利用df和grep,取出磁盤各分區利用率,并從大到小排序
答案
1.
方法一:
cat /proc/meminfo |sort -f |tail -n13 | head -n7
方法二:
grep? “^[S,s]” /proc/meminfo
grep -i “^s” /proc/meminfo
2.
cat /etc/passwd | grep -v “/bin/bash$”
3.
cat /etc/passwd | grep -w “^rpc” | cut -d: -f7
4.
grep -Ewo “[0-9]{2,3}” /etc/passwd
5.
cat /etc/grub2.cfg | grep -Ew “^[[:space:]]+.*[[:alnum:]]+”
6.
netstat -tan | grep? “LISTEN[[:space:]]*$”
7.
cat /etc/passwd | cut -d: -f1,3 | grep -Ew “[0-9]{1,3}$”
8.
cat /etc/passwd | grep -E “^(.*):.*/\1$” /etc/passwd???????????????????????? 見6.2.1:00
9.
df | grep? “/dev/sd” | grep -Eo “[0-9]{1,3}%” | sort -nr ?| tr? “%” ” ”
3、擴展正則表達式
egrep
1、顯示三個用戶root、 mage、 wang的UID和默認shell
2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一
個小括號的行
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
4、使用egrep取出上面路徑的目錄名
5、統計last命令中以root登錄的每個主機IP地址登錄次數
6、利用擴展正則表達式分別表示0-9、 10-99、 100-199、 200-249、 250-255
7、顯示ifconfig命令結果中所有IPv4地址
8、將此字符串:welcome to magedu linux 中的每個字符去重并排序,重復次數多的排到前面
答案
1.grep -Ew “^(root|mage|wang)” /etc/passwd |cut -d: -f3,7
2.cat /etc/rc.d/init.d/functions | grep -E “^[a-z_].*(.*)”
3.echo /etc/rc.d/init.d/functions | grep -Eo “[^/]*/?$”
4.echo /etc/rc.d/init.d/functions | grep -Eo “^/.*/”
echo? /etc/rc.d/init.d/functions | grep -Eo “.*\<”
5.last | grep “^root” | tr -s ” ” | cut -d” ” -f3 | grep -E “^([0-9]{1,3}\.){3}([0-9]{1,3}){1}” | uniq -c
6.
1.0-9 :[0-9]
2.10-99 : grep -Ewo “[1-9][0-9]”? /etc/passwd
3.100-199: grep -Ewo “1[0-9][0-9]” /etc/passwd
4.200-249:grep -Ewo “2[0-4][0-9]” /etc/passwd
5.250-255:grep -Ewo “25[0-5]” /etc/passwd
7.
ifconfig |grep -E “([0-9]{1,3}\.){3}([0-9]{1,3}){1}”
8.
4、vim文本編輯工具
vim
擊鍵行為是依賴于 vim的 的“模式”
三種主要模式:
命令(Normal)模式:默認模式,移動光標,剪切/粘貼文本
插入(Insert)或編輯模式: 修改文本
擴展命令(extended command )模式: 保存,退出等
Esc鍵 退出當前模式
Esc鍵 Esc鍵 總是返回到命令模式
注意:
各模式退出到命令模式ESC
進入插入模式I
進入擴展模式shift + :
存盤在擴展模式: qw
沒任何改動想直接退出:q
有改動但不想保存直接退出:q!
如果想另存為其他文件w /data/filename
如果文件已經存在想強行覆蓋w! /data/filename
如果想把另一個文件讀入到當前文件中r /etc/issue
如果該文件存在,文件被打開并顯示內容
如果該文件不存在,當編輯后第一次存盤時創建它
VISUAL模式 : v鍵進入v鍵退出
1.直接打開文件編輯第N行
vim +10 /etc/passwd
2.支持正則表達式
直接編輯rpc開頭的行
vim +/^rpc
3.比較文件,不同的地方用紅色標出
vim -d f1 f2
4.只讀文件不修改
vim -m
5.直接進入ex模式就是擴展模式
vim -e
6.進入插入模式并直接在行首輸入
I
7.在當前光標所在行行尾并切換到插入模式
A
8.在當前光標所在處后面輸入并切換到插入模式
a
9.在當前光標所在行的下方打開一個新行并切換到插入模式
o
10.在上方打開新行并切換到插入模式
O
11.在命令模式的保存與退出
ZZ:保存退出
ZQ:不保存退出
12.擴展命令模式下可以直接輸出命令查詢相關數據
!hostname
13.擴展命令模式下讀取直接輸入命令的相關數據
r!hostname
14.編輯字符red顏色
echo -e “\e[1;31mred\e[0m”
在vim里
在插入模式下按
ctrl + v + [ 代替 \e 其他一樣即可
15.命令行的翻屏操作
Ctrl+f: 向文件尾部翻一屏
Ctrl+b: 向文件首部翻一屏
Ctrl+d: 向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
16.命令模式的剪切,粘貼
剪切用x
粘貼用p 是粘貼在當前光標字符后面
例如:
work 想直接刪除或者剪切work,直接4x
如果想在光標位置黏貼work則直接p
17.大小寫轉換
~
18.替換模式
r: 替換光標所在處的字符
R:切換成REPLACE模式
19.刪除命令
d
1)刪除當前光標到行結尾
先按d? 然后按$
2)刪除當前光標到行首
先按d? 然后按^
3)刪除光標所在的行
dd
4)多行刪除
#dd
20.復制命令
y
行首 y^
行尾 y$
整行 yy
復制多行 #yy
21.黏貼命令
p? 如果是整行則是在下方
P? 如果是整行則是在上方
22.刪除并切換到插入模式
c
詳細用法參考y,r
23.在命令模式下跳轉光標
#G 跳到指定行
G最后一行
1G,gg第一行
擴展命令模式下的地址定界
:start_pos,end_pos
# 具體第#行,例如2表示第2行
#,# 從左側#表示起始行,到右側#表示結尾行
#,+# 從左側#表示的起始行,加上右側#表示的行數
:2,+3 表示2到5行
. 當前行
$ 最后一行
.,$-1 當前行到倒數第二行
% 全文, 相當于1,$
擴展命令模式下的搜索替代
1.搜索1到10行下的bash全用csh替代
:1,10s/bash/csh/g
注意:如果不帶g系統默認會找第一個bash替換成csh但是如果同一行里有其他csh則不會替換
2.把/etc/passwd下第二行的/bin替換成/usr/bin? @或者#號也可以
:2s@/bin@/usr/bin@g
3.搜索文件中的haha替代成hahaer
這里%代表搜索全文
%s/\(haha\)/\1er/g
4.全文搜索UUID開頭的行并在前面添加#
%s/^\(UUID\)/#\1/
以上是分組的寫法,不分組可以直接用&
%s/^UUID/#&/
5.命令模式:撤銷更改
u
#u 一次撤銷多次命令
U? 同一行經過多次修改后直接返回最初沒有修改的狀態
Ctrl + r?? 重做最后的”撤銷”更改
.重復前一個操作
n.重復前一個操作n次
6.vim的寄存器
名稱為a-z 共26個寄存器和一個無名寄存器
如? :?? 3″tyy 表示復制3行到t寄存器中
4″ayy? 表示復制4行到a寄存器中
“tp 表示:粘貼t寄存器中的內容
“ap? 表示粘貼a寄存器中的內容
可視化模式
(類似window操作,光標類似鼠標的功能)
v 切換到針對字符
V 切換到針對行
ctrl+v 切換到針對塊
y復制? p粘貼 d刪除
練習
1、復制/etc/profile至/tmp/目錄,用查找替換命令刪除/tmp/profile文件中的行首的空白字符
2、復制/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令為/tmp/functions的每行開頭為空白
字符的行的行首添加一個#號
答案
1.
cp -a /etc/profile /tmp/
vim /tmp/profile
ctrl+:
%s@^\([[:space:]]\)*@@
ctrl+:
wq
2.cp -a /etc/rc.d/init.d/functions? /tmp
vim? /tmp/functions
ctrl+:
%s@^\([[:space:]]\)@#&@
練習2
1、在vim中設置tab縮進為4個字符
2、復制/etc/rc.d/init.d/functions文件至/tmp目錄,替換/tmp/functions文件中的/etc/sysconfig/init
為/var/log
3、刪除/tmp/functions文件中所有以#開頭,且#后面至少有一個空白字符的行的行首的#號
答案
2.cp /etc/rc.d/init.d/functions /tmp
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95935