第1章 三劍客之一 awk
1.1 awk字符參數統計表
1.2 參數字符舉例 php
第2章 三劍客之二 sed
2.1 sed字符參數統計表
2.2 參數字符舉例 python
第3章 三劍客之三 grep
3.1 參數字符統計表
3.2 參數字符舉例linux
第4章 通配符
4.1 通配符統計表格
4.2 通配符舉例 nginx
第5章 特殊符號
5.1 特殊符號統計表 web
第6章 三劍客的正則表達式
6.1 正則表達式的定義
6.2 正則表達式的運用區分通配符
6.3 正則表達式的注意事項
6.4 正則表達式的分類
6.5 三劍客正則表達式字符統計表 正則表達式
命令解釋:awk是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。express
題意:取出ett.txt 中第25行到第30行編程
[root@oldboy34 data]# awk 'NR>=25&&NR<=30' ett.txtapi
25數組
26
27
28
29
30
awk '!/oldboy/' test.txt
test
liyao
表示取出第2例和第3例
[root@oldboy-muban data]# ls -l total 20 drwxr-xr-x. 2 root root 4096 Jan 6 17:56 a drwxr-xr-x. 2 root root 4096 Jan 6 17:56 b drwxr-xr-x. 2 root root 4096 Jan 6 17:56 c drwxr-xr-x. 2 root root 4096 Jan 6 17:56 d -rw-r--r--. 1 root root 97 Dec 23 19:45 oldboy.txt [root@oldboy-muban data]# ls -l |awk '{print $2,$3}' 20 2 root 2 root 2 root 2 root 1 root
取所有
ls -l |awk '$2>1' 顯示出第二列數值>1 的每行
[root@oldboy-muban ~]# ls -l |awk '$2>1'
total 36
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 a
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 b
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 c
經常使用格式 awk -F " 指定內容" '{print $4第四行,$6 }’ oldboy.txt
[root@oldboy-muban oldboy]# cat oldboy.txt
I am oldboy,myqq is 31333741
[root@oldboy-muban ~]# awk -F "[ ,]" '{print $3,$6}' /oldboy/oldboy.txt
oldboy 31333741
-F "[空格 ,]" 指定多把菜刀 分別以 空格和 ,號當分割符號
[root@oldboy-muban ~]# awk -F "[ ,]" '{print $3,$6}' /oldboy/oldboy.txt
oldboy 31333741
顯示列中插入 12345 可是顯示內容要加 '' "
[root@oldboy-muban oldboy]# awk -F "[ ,]" '{print $3" 12345 "$6}' oldboy.txt
oldboy 12345 31333741
print 和NR 組合爲輸出的列顯示行號
NR表示行號(第幾行) $0 表示整列(表示取第幾列)
[root@oldboy-muban logs]# echo stu{1..6} |xargs -n2 >ett.txt 插入兩行
[root@oldboy-muban logs]# cat ett.txt
stu1 stu2
stu3 stu4
stu5 stu6
[root@oldboy-muban ~]# awk '{print NR,$0}' nginx.conf (NR表示第幾行開始標記行號$0表示所有列)
1 stu1 stu2
2 stu3 stu4
3 stu5 stu6
[root@oldboy-muban ~]# awk '{print NR,$2}' nginx.conf ($2 第二列 並默認從頭行標號)
1 stu2
2 stu4
3 stu6
[root@oldboy-muban ~]# awk '{print NR==1,$2}' nginx.conf (NR==1給指定行標註1 )
1 stu2
0 stu4
0 stu6
awk '/ ^d/' ( ^ 特殊字符 表示以d開頭的文件或字符)
因此:ls -l | awk '/^d /'
[root@oldboy-muban ~]# ls -l
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 a
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 b
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 c
-rw-r--r--. 1 root root 0 Jan 3 10:15 jeacen
-rw-r--r--. 1 root root 0 Jan 9 16:35 nginx.conf
drwxr-xr-x. 7 root root 4096 Jan 3 10:15 oldboy
[root@oldboy-muban ~]# ls -l |awk '/^d/'
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 a
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 b
drwxr-xr-x. 2 root root 4096 Jan 3 10:11 c
命令解釋:sed是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能與衆不同。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。
##刪除文件中的空行兩種方法
方法一: sed -r '/^$|^[ \t]+$/d
方法二: sed -r '/^[ \t]*$/d'
環境以下
[root@oldboy-muban ~]# cat 1.txt
oldboy
zhabanzhang
zbanz
oldboy
[root@oldboy-muban ~]# cat -A 1.txt
oldboy$
$
zhabanzhang$
^I^I^I$
^Izbanz$
$
oldboy$
方法一:
[root@m01 ~]# sed -r '/^$|^[ \t]+$/d' 1.txt
oldboy
zhabanzhang
zbanz
oldboy
方法二:
[root@m01 ~]# sed -r '/^[ \t]*$/d' 1.txt
oldboy
zhabanzhang
zbanz
oldboy
[root@oldboy-muban ~]# sed 'd' person.txt
[root@oldboy-muban ~]# sed '2,3d' person.txt
101,oldboy,CEO
104,yy,CFO
105,feixue,CIO
[root@oldboy-muban ~]# sed '2,3!d' person.txt
102,zhangyao,CTO
103,Alex,COO
[root@oldboy-muban ~]# sed '3d;5d' person.txt
101,oldboy,CEO
102,zhangyao,CTO
104,yy,CFO
注意:正則不肯定性 工做中用數字刪
[root@oldboy-muban ~]# sed 'w oldboy123.txt' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy-muban ~]# ls
01 1.txt.bak anaconda-ks.cfg install.log oldboy123.txt pass.txt person.txt wangxiaog.txt wxd.sh
該命令一塊兒使用表示只打印那些發生替換的行(取消默認輸出)
格式:sed -n ' 20p'
只查看ett.txt文件(共100行)內第20到第30行的內容
[root@oldboy34 data]# sed -n '20,30p' ett.txt
20
21
22
23
24
25
26
27
28
29
30
[root@oldboy-muban data]# cat ett.txt
I am oldboy,myqq is 31333741
[root@oldboy-muban data]# sed "s#,myqq is# #g" ett.txt |sed "s#I am##g"
oldboy 31333741
[root@oldboy-muban oldboy]# echo "123456"|sed -r 's#.(.)....#\1#g'
2
[root@oldboy-muban oldboy]# echo "123456"|sed -r 's#.(.).(.).(.)#\1\2\3#g'
246
反向引用的兩組字符中能夠插入內容 |
[root@oldboy-muban oldboy]# echo "123456"|sed -r 's#.(.).(.).(.)#\1,\2#g'
2,4
[root@oldboy-muban oldboy]# echo "123456"|sed -r 's#.(.).(.).(.)#\1,\2,\3#g'
2,4,6
[root@oldboy-muban oldboy]# echo "123456"|sed -r 's#.(.).(.).(.)#\1:\2:\3#g'
2:4:6
[root@oldboy-muban oldboy]# echo "123456"|sed -r 's#.(.).(.).(.)#\1+\2+\3#g'
2+4+6
反向引用出來的字符後也能夠插入內容 |
[root@oldboy-muban oldboy]# echo "123456"|sed -r 's#.(.).(.).(.)#\1,2#g'
2,2
[root@oldboy-muban oldboy]# head -1 passwd
root:x:0:0:root:/root:/bin/bash
[root@oldboy-muban oldboy]# sed -r 's#(^root)(:.*:)(/b.*sh$)#\3\2\1#g' passwd |head -1
/bin/bash:x:0:0:root:/root:root
[root@oldboy-muban oldboy]# sed -r 's#(root)(:x.*:)(/b.*sh$)#\3\2\1#g' passwd |head -1
/bin/bash:x:0:0:root:/root:root
[root@oldboy-muban ~]# sed -r 's#.##2' /etc/passwd |head -5
rot:x:0:0:root:/root:/bin/bash
bn:x:1:1:bin:/bin:/sbin/nologin
demon:x:2:2:daemon:/sbin:/sbin/nologin
am:x:3:4:adm:/var/adm:/sbin/nologin
l:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@oldboy-muban ~]# sed -r 's#.(.)$##g' /etc/passwd |head -5
root:x:0:0:root:/root:/bin/ba
bin:x:1:1:bin:/bin:/sbin/nolog
daemon:x:2:2:daemon:/sbin:/sbin/nolog
adm:x:3:4:adm:/var/adm:/sbin/nolog
lp:x:4:7:lp:/var/spool/lpd:/sbin/nolog
[root@oldboy-muban ~]# sed -r 's#[a-z]+##2' /etc/passwd |head -5
root::0:0:root:/root:/bin/bash
bin::1:1:bin:/bin:/sbin/nologin
daemon::2:2:daemon:/sbin:/sbin/nologin
adm::3:4:adm:/var/adm:/sbin/nologin
lp::4:7:lp:/var/spool/lpd:/sbin/nologin
[root@oldboy-muban ~]#
方法一
[root@oldboy-muban ~]# sed -r 's#[a-z]+/([a-z]+$)#/\1#g' /etc/passwd |head -1
root:x:0:0:root:/root://bash
方法二
[root@oldboy-muban ~]# sed -r 's#[a-z]+##5' /etc/passwd |head -1
root:x:0:0:root:/root://bash
[root@oldboy-muban ~]# sed -r 's#(^.)(.)#\2\1#g' /etc/passwd |head -1
orot:x:0:0:root:/root:/bin/bash
sed -r 's#[ ]+##g' /etc/passwd
sed -r 's#[ ]+#\t#g' /etc/passwd
sed -r 's#([ A-Z])#(\1)#g' /etc/passwd
[root@oldboy-muban ~]# sed -r 's#(.*),(.*),(.*)#&.................\1 \2 \3#g' person.txt
101,oldboy,CEO.................101 oldboy CEO
102,zhangyao,CTO.................102 zhangyao CTO
103,Alex,COO.................103 Alex COO
104,yy,CFO.................104 yy CFO
105,feixue,CIO.................105 feixue CIO
[root@oldboy-muban ~]# sed -r 's#(.*),(.*),(.*)#&.................\1 \2 \3#' person.txt
101,oldboy,CEO.................101 oldboy CEO
102,zhangyao,CTO.................102 zhangyao CTO
103,Alex,COO.................103 Alex COO
104,yy,CFO.................104 yy CFO
105,feixue,CIO.................105 feixue CIO
[root@oldboy-muban test]# ls |xargs -n1
stu_102999_1_finished.jpg
stu_102999_2_finished.jpg
stu_102999_3_finished.jpg
stu_102999_4_finished.jpg
stu_102999_5_finished.jpg
[root@oldboy-muban test]# ls |xargs -n1 |sed -r 's#(.*)_(.*)_(.*)_(.*)#mv & \1_\2_\3.jpg #g' |bash
[root@oldboy-muban test]# ls
stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg stu_102999_5.jpg
[root@oldboy-muban test]# ls -l
total 0
-rw-r--r-- 1 root root 0 Feb 22 15:22 stu_102999_1.jpg
-rw-r--r-- 1 root root 0 Feb 22 15:22 stu_102999_2.jpg
-rw-r--r-- 1 root root 0 Feb 22 15:22 stu_102999_3.jpg
-rw-r--r-- 1 root root 0 Feb 22 15:22 stu_102999_4.jpg
-rw-r--r-- 1 root root 0 Feb 22 15:22 stu_102999_5.jpg
[root@oldboy-muban ~]# sed -rn '/oldboy|Alex/p' person.txt
101,oldboy,CEO
103,Alex,COO
[root@oldboy-muban ~]#
題:以下取出 第一行 和 uid後面的數字
[root@fifi tmp]# cat /tmp/test.txt
//xcbb_web/mobileLive/searchRecentUserLiveResult channel=App%20Store&clientType=1&packageName=com.prsoft.vncShow&page=1&pageSize=50&province=%E7%83%AD%E9%97%A8&sex=2&token=TWpBd05UZ3lNVFRDcDNScmQyeHlNM3BtYTNVeE5UQTFNVFF4TURnNU5ESTR3cWN4TlRFeE16WTRNalEzTURBMw%3D%3D&type=3&uid=20058214&version=1.1.1 "-"
//xcbb_web/business/mobile/api/getActiviWeekStarTask uid=20016107&token=TWpBd01UWXhNRGZDcHpOMmVEQjZhakYwZW5JeE5EazRPRGN3TURVME9Ua3d3cWN4TlRFeE56a3pPVEU0TURNdw==
方法:
[root@fifi tmp]# sed -r 's#(^//.*)/.*uid=(.*).&(.*$)#\1,\2#g' /tmp/test.txt |awk -F "[ / ,]+" '{print $2,$NF }'
xcbb_web 2005821
xcbb_web 2001610
sed -n '/2018-06-21 09:10:43/,/2018-06-21 09:50:/p' catalina.out > /tmp/1.txt
命令解釋:grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
grep -v "oldboy" test.txt
root@oldboy34 ~]# cat text.txt
test
liyao
oldboy
[root@oldboy34 ~]# grep -v "oldboy" text.txt
test
liyao
-A 10 after 顯示你要找的行,及他後面的10行
-B 10 before 顯示你要找的行,及他前面的10行
-C 10 context 找到你要找的行,及他前面的10行和後面的10行
[root@oldboy-muban ~]# grep -A 5 10 oldgil.txt
10
11
12
13
14
15
來使用 表示插入行號
[root@oldboy-muban ~]# cat -n oldboy.txt| grep -A 2 7
7 jfdslj
8 jsdl
grep -i 不區分大小寫
oldpwd = cd -
root@oldboy-muban oldboy]# pwd
/oldboy
[root@oldboy-muban oldboy]# cd -
/tmp
[root@oldboy-muban tmp]# env |grep -i "oldpwd"
OLDPWD=/oldbo
grep -n 過濾後標註行號
[root@oldboy-muban ~]# grep -n "stu" nginx.conf
1:stu1
2:stu2
[root@oldboy-muban ~]# grep -n "." nginx.conf (.表示當前列中的任意字符)
1:stu1
2:stu2
[root@oldboy-muban oldboy]# cat oldboy.txt
I am oldboy,myqq is 31333741
[root@oldboy-muban ~]# awk -F "[ ,]" '{print $3,$6}' /oldboy/oldboy.txt|grep -E "oldboy|31333741 "
oldboy 31333741
[root@oldboy-muban logs]# cat ett.txt
stu1 stu2
stu3 stu4
stu5 stu6
[root@oldboy-muban logs]# grep -o "stu4" ett.txt
stu4
[root@oldboy-muban logs]# egrep -o "stu4|stu5" ett.txt
stu4
stu5
stu* *.log 以什麼開頭或以什麼結尾的所有文件
[root@oldboy-muban logs]# ls oldboy*
oldboy01.txt oldboy03.txt oldboy05.txt oldboy07.txt oldboy09.txt
oldboy02.txt oldboy04.txt oldboy06.txt oldboy08.txt
[root@oldboy-muban logs]# ls *.txt
ett.txt oldboy02.txt oldboy04.txt oldboy06.txt oldboy08.txt
oldboy01.txt oldboy03.txt oldboy05.txt oldboy07.txt oldboy09.txt
?? ??? 任何一個文本/字符
ls ?
[root@oldboy-muban logs]# ls
1 2 4 ett.txt.bak oldboy02.txt oldboy04.txt oldboy06.txt
1.2 3 ett.txt oldboy01.txt oldboy03.txt
[root@oldboy-muban logs]# ls ?
1 2 3 4
[abcd] 表示一個總體裏面有四種狀況 [] 表示一個總體 要找 a或b或 c或 d
*[abcd]
*[abcd]*
*[abcd]*
[root@oldboy-muban logs]# ls *[1-4]*
oldboy01.txt oldboy02.txt oldboy03.txt oldboy04.txt
stu1:
stu2:
stu3:
stu4:
echo {0..10} {a..z} {z..a} 生成序列一連串的文本
oldboy{01..10} 生成一連串的文件或目錄
c{a,b} c{,b} {a,b,c}{1,2,3} 生成的分別匹配的序列
seq 20 120 > ett.txt (生成20-120) seq 1 2 10 |xargs ( 生成奇數)
c{,b}
[root@oldboy-muban logs]# ls
ett.txt stu1 stu2 stu3 stu4 stu5
[root@oldboy-muban logs]# cp ett.txt{,.bak}
[root@oldboy-muban logs]# ls
ett.txt ett.txt.bak stu1 stu2 stu3 stu4 stu5
{1..5}{a..d}
[root@oldboy-muban logs]# touch stu{1..5}{a..d}
[root@oldboy-muban logs]# ls
1.2 ett.txt.bak stu1b stu1d stu2b stu2d stu3b stu3d stu4b stu4d stu5b stu5d
ett.txt stu1a stu1c stu2a stu2c stu3a stu3c stu4a stu4c stu5a stu5c
oldboy[^4-8].txt
[root@oldboy-muban logs]# ls -l oldboy0[^4-8].txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy01.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy02.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy03.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy09.txt
oldboy[^678].txt
[root@oldboy-muban logs]# ls -l oldboy0[^678].txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy01.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy02.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy03.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy04.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy05.txt
-rw-r--r--. 1 root root 0 Jan 10 16:36 oldboy09.txt
{無空格要,號}
[root@oldboy-muban logs]# echo {1..5}{ a..f}
1{ 2{ 3{ 4{ 5{ a..f}
{裏面不能接路徑}
[root@oldboy-muban logs]# cp ett.txt{,/tmp/.bak}
cp: accessing `ett.txt/tmp/.bak': Not a directory
廣義:
一、正則表達式就是爲了處理大量的文本|字符串而定義的一套規則和方法。
二、經過定義的這些特殊符號的輔助,系統管理員就能夠快速過濾,替換或輸出須要的字符串,Linux正則表達式通常以行爲單位處理。
簡單理解:
一、爲處理大量文本|字符串而定義的一套規則和方法
二、以行爲單位出來
正則表達式是一種描述一組字符串的模式,;相似於數學表達式,經過各類操做符 組成更小的表達式。
運用:大齡過濾日誌工做,化繁爲易 更簡單,高效,易用。
區分:三劍客都支持,並且運用很是普遍(php per python 都支持)
ls* 支持通配符
正則表達式用來找 文件內容,文本 字符串
通配符用來找文件名或文件普通命令都支持
1、正則表達式是 以行爲單位處理字符串
2、顏色別名 通常配合grep egrep 來學習
例:配置別名
[root@oldboy-muban ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
3、注意字符集
①基本正則表達式(BRE —— basic regular expression)
②高級功能擴展正則表達式(ERE —— extended regular expression)
③BRE和ERE 的區別僅僅是元字符的不一樣
BRE支持的元字符有(^ $ . [ ] * )其餘字符識別爲普通字符:\(\)
E RE添加了() { } ? + | 等
只有在用反斜槓「\」進行轉義的狀況下,字符( ){ } 纔會在BRE被當作元字符處理
在ERE中,任何元符號前面加上反斜槓反而會使其被當作普通字符來處理