第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中,任何元符号前面加上反斜杠反而会使其被当作普通字符来处理