1 正则表达式
1.1 正则表达式 是什么?
它主要用于 字符串的模式分割,匹配, 查找及替换操作。
1.2 正则表达式与通配符的区别
正则表达式: 用来匹配文件中的字符串的,专门用来匹配数据的,正则是包含匹配。grep,awk,sed 等命令可以支持正则表达式。搜索字符串的命令支持正则
通配符 : 用来匹配文件名称的,通配符是完全匹配。搜索文件的命令支持通配符。
任意多个字符
? #匹配任意一个字符
[] #匹配中括号中的任意一个字符
[root@aliyun247 ~]# find . -name "abc*"
./test/abc
./test/abcd
[root@aliyun247 ~]# find . -name "abc?"
./test/abcd
1.3 基础正则表达式1
基础正则表达式
元字符 | 作用 |
* | 前一个字符匹配0次或任意多次 |
. | 匹配除了换行符之外任意一个字符 |
^ | 匹配行首。例如^hello 会匹配hello开头的行。 |
$ | 匹配行尾。例如hello$ 会匹配以hello 结尾的行 |
[] | 匹配中括号中任意一个指定的字符,只匹配一个字符。例如[aeiou]匹配任意一个元音字母,[0-9]匹配任意一个数字,[a-z][0-9]匹配一个小写字母和一个数字组成的2位字符 |
[^] | 匹配除中括号以外的任意一个字符, 例如[^0-9] 匹配任意一个非数字的字符, [^a-z] 表示任意一位非小写字母 |
\ | 转义符,用于取消。将特殊符号的含义取消 |
\{n\} | 表示其前面的 字符 恰好出现 n次。 例如 [0-9]\{4\} 匹配4位数字。[1][1-8][0-9]\{9\} 匹配手机号码 |
\{n,\} | 表示 其前面的字符 出现不小于n次, 例如 [0-9]\{2,\} 表示2位及以上的数字 |
\{n,m\} | 表示 其前面的字符 至少出现n次,最多出现m次,例如 [a-z]\{6,8\} 匹配6到8位的小写字母 |
* 前一个字符匹配0次或任意多次
a*
#匹配所有内容 包括空白行
aa*
#匹配至少包含一个a的行
aaa*
#匹配最少包含2个连续a的字符串
aaaaa*
#匹配最少包含4个a的连续的字符串
[root@aliyun247 test]# grep "a*" abc
aa
aa
aaa
aaa
aaaa
bbbbb
bbbbbb
bbbbb
bbbbdb
abcdimooc
abcdeimooc
imoocabcsd
[root@aliyun247 test]# grep "aa*" abc
aa
aa
aaa
aaa
aaaa
abcdimooc
abcdeimooc
imoocabcsd
[root@aliyun247 test]# grep "aaa*" abc
aa
aa
aaa
aaa
aaaa
1.4 基础正则表达式2
".*"
#匹配所有行
"^$"
#匹配空白行
[root@aliyun247 test]# grep "^$" abc
[root@aliyun247 test]# grep -n "^$" abc
4:
7:
[ ]: 匹配中括号中指定的 任意一个 字符
注意: ^ : 在中括号外部 代表 开头,在中括号里边 代表 取反
[a-z]
[root@aliyun247 test]# grep -n '^[0-9]' abc
7:144bgggg
8:4444shhh
9:12322:
10:12223
11:2123
[root@aliyun247 test]# grep -n '[0-9]$' abc
11:2123
[root@aliyun247 test]# grep -n '[^0-9]$' abc
1:aa
2:aa
3:aaa
5:aaaa
6:bbbbb
7:144bgggg
8:4444shhh
9:123dddd22:
10:12223ddd
14:bbbbb
15:bbbbdb
16:abcdimooc
17:abcdeimooc
18:imoocabcsd
[root@aliyun247 test]# grep -n '[0-9$]' abc
7:144bgggg
8:4444shhh
9:123dddd22:
10:12223ddd
11:2123
^[^a-z]: 代表 非a-z 小写字母开头的行。
^[^a-zA-Z]: 代表 匹配不用字母开头的行。
1.5 基础正则表达式3
\ ;取消特殊含义的字符
av\{2,3}\d
ac\{3}\x
v\{4,9}\d
正则是实验科学,需要多实验,这种模糊匹配加上 前后定界符比较准确。
[root@aliyun247 test]# grep "a\{2\}" abc
aa
aa
aaa
aaaa
[root@aliyun247 test]# grep "a\{2,4\}" abc
aa
aa
aaa
aaaa
[root@aliyun247 test]# grep "a\{1,4\}b" abc
abcdimooc
abcdeimooc
imoocabcsd
[root@aliyun247 test]# grep "a\{2,4\}b" abc
[root@aliyun247 test]# grep "b\{1\}" abc
bbbbb
144bgggg
bbbbb
bbbbdb
abcdimooc
abcdeimooc
imoocabcsd
[root@aliyun247 test]# grep "b\{1\}d" abc
bbbbdb
[root@aliyun247 test]# grep "b\{1,5\}d" abc
bbbbdb
[root@aliyun247 test]# grep "abc.i" abc
abcdimooc
[root@aliyun247 test]# grep "abc\.i" abc
2 字符截取命令
grep 命令 :在文件中提取符合条件的 行
grep -v [关键字]
#取反
[root@aliyun247 /]# grep "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
nagios:x:500:500::/home/nagios:/bin/bash
dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
[root@aliyun247 /]# grep "/bin/bash" /etc/passwd | grep "root"
root:x:0:0:root:/root:/bin/bash
[root@aliyun247 /]# grep "/bin/bash" /etc/passwd | grep -v "root"
nagios:x:500:500::/home/nagios:/bin/bash
dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
[root@aliyun247 /]#
2.1 cut 命令
cut :列 提取命令
cut [ 选项 ] [文件名]
选项
-f 列号,提取第几列
-d 分隔符,按照指定分隔符 分割列
[root@aliyun247 /]# grep "/bin/bash" /etc/passwd |grep -v "root" |cut -f 1 -d ":"
nagios
dxm
bingbing
cut 失效了?????why ????
cut 命令比较简单 它适用于截取规则的文件 默认是制表符作为分隔符,如果文件中没有制表符,那么它把所有文件当成一列 内容。
[root@aliyun247 /]# df -h | cut -f 1,3
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 7.0G 12G 38% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/xvdb1 493G 4.0G 464G 1% /data
[root@aliyun247 /]# df -h |cut -f 1,3 -d " "
Filesystem
/dev/xvda1
tmpfs
/dev/xvdb1
2.2 printf 命令
格式化 标准输出命令
printf ‘输出格式 输出类型’ 输出内容
输出类型:
%ns:输出字符串,n是数字 指代输出几个字符串
%ni : 输出整数,n是数字 指代输出几个数字
%m.nf:输出浮点数,m和n是数字,指代输出的整数 位数和 小数位数。
例如:%8.2f 代表共输出8位数字其中2位是小数 6位是整数。
输出格式:
\a:输出警告音
\b: 输出退格键,也就是backspace键
\f: 清屏
\n:换行
\r: 回车
\t :水平输出退格 也就是tab键
\v: 垂直输出退格 也就是tab键
[root@aliyun247 ~]# printf %s 123456
123456[root@aliyun247 ~]# printf '%s\n' 123456
123456
[root@aliyun247 ~]# printf '%s\t'%s\t%s'\n' 123456
123456 t
[root@aliyun247 ~]# printf '%s\t%s\t%s\n' 123456
123456
[root@aliyun247 ~]# printf '%s\t %s \t %s\n' 123456
123456
[root@aliyun247 ~]# printf '%s\t%s\t%s\n' 1 2 3 4 5 6
1 2 3
4 5 6
2.3 awk命令
awk ‘条件1{动作1}条件2{动作2}....’ 文件名
条件(patern)
一般使用关系表达式作为条件
x>10 判断变量是否大于10
x>=10 大于等于
x<=10 小于等于
动作(action)
格式化输出
流程控制
[root@aliyun247 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 7.1G 12G 38% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/xvdb1 493G 4.0G 464G 1% /data
[root@aliyun247 ~]# df -h |awk '{print $2,$3}'
-bash: aw{print $2,$3}: command not found
[root@aliyun247 ~]# df -h |awk '{print $2,$3}'
Size Used
20G 7.1G
7.8G 0
493G 4.0G
[root@aliyun247 ~]# df -h|grep '/dev/sda5' | awk '{print $1,$2,$5}'
[root@aliyun247 ~]# df -h|grep "/dev/sda5" | awk '{print $1,$2,$5}'
[root@aliyun247 ~]# df -h|grep "/dev/xvda1" | awk '{print $1,$2,$5}'
/dev/xvda1 20G 38%
[root@aliyun247 ~]# df -h|grep "/dev/xvda1" |awk '{print $5}'|cut -d "%" -f 1
38
FS内置变量
BEGIN 用法:
[root@aliyun247 ~]# grep "/bin/bash" /etc/passwd |awk '{FS=":"}{print $1,$3}'
root:x:0:0:root:/root:/bin/bash
nagios 500
dxm 501
bingbing 504
[root@aliyun247 ~]# grep "/bin/bash" /etc/passwd |awk 'BEGIN{FS=":"}{print $1,$3}'
root 0
nagios 500
dxm 501
bingbing 504
END
关系运算符
2.4 sed命令
sed 是主要用来将数据进行选取,替换,删除,新增等命令。
sed [选项] '动作' 文件名
选项
-n 一般sed命令会把所有的数据输出到屏幕,如果经过此选项则只会把经过sed命令处理的行输出到屏幕。
-e 容许对输入数据应用多条sed命令编辑。
-i 用sed的修饰结果直接修改读取数据的文件,而不是由屏幕输出
动作
-a 追加 在当前行后添加一行或多行
-c 行替换,用c后面的字符替换原数据行
-i 插入, 在当前行前 插入一行或多行。
-d 删除 ,删除指定行
-p 打印,输出指定的行
-s 字符替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字符/新字符/g”(和vim中替换格式类似)
p打印
[root@aliyun247 ~]# sed -n '3p' test/1.txt
roooooot
[root@aliyun247 ~]# sed -n '3,8p' test/1.txt
roooooot
roat
ro t
rtddddddddddddddddddddddddd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@aliyun247 ~]#
d 删除
sed '2d' test/1.txt
a 追加
[root@aliyun247 ~]# sed '1a this is sed add' test/1.txt
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
this is sed add
roooooooooasdvbt
roooooot
roat
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
这些操作 操作的是输出内容 而不是文件本身
[root@aliyun247 ~]# cat test/1.txt
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
roooooooooasdvbt
roooooot
roat
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
i 插入
[root@aliyun247 ~]# sed ' 1i this is sed add ' test/1.txt
this is sed add
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
roooooooooasdvbt
roooooot
roat
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
c 行替换
[root@aliyun247 ~]# sed '2c this is sed test c' test/1.txt
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
this is sed test c
roooooot
roat
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
s 字符替换
[root@aliyun247 ~]# sed '5s/bingbing/licheng/g' test/1.txt
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
roooooooooasdvbt
roooooot
roat
licheng:x:504:889:bjbskf:/home/licheng:/bin/bash
[root@aliyun247 ~]# sed 's/o/f/g' test/1.txt
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
rfffffffffasdvbt
rfffffft
rfat
bingbing:x:504:889:bjbskf:/hfme/bingbing:/bin/bash
[root@aliyun247 ~]# cat test/1.txt
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
roooooooooasdvbt
roooooot
roat
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
操作的是数据输出,而不是文件本身
如果要操作文件本身 则加 -i
[root@aliyun247 ~]# sed -i 's/o/f/g' test/1.txt
[root@aliyun247 ~]# cat test/1/txt
cat: test/1/txt: No such file or directory
[root@aliyun247 ~]#
[root@aliyun247 ~]# cat test/1.txt
123455677,1324325,45434534,dgttg,vvgwefsf,sxx,
rfffffffffasdvbt
rfffffft
rfat
bingbing:x:504:889:bjbskf:/hfme/bingbing:/bin/bash
3 字符处理命令
3.1sort 排序命令
sort [选项] 文件名
选项
-f 忽略大小写
-n 以数值进行排序,默认使用字符串排序
-r 取反
-t 指定分割符,默认分隔符是制表符
-k n[,m] :按照指定的字段范围 排序。从第n字段开始,到m字段结束,(默认到行尾)
[root@aliyun247 ~]# sort /etc/passwd
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
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
dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql:x:27:27::/home/mysql:/sbin/nologin
nagios:x:500:500::/home/nagios:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
tcpdump:x:72:72::/:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
[root@aliyun247 ~]#
-r 取反
[root@aliyun247 ~]# sort -r /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
nagios:x:500:500::/home/nagios:/bin/bash
mysql:x:27:27::/home/mysql:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
-t 指定分割符
-k
[root@aliyun247 ~]# sort -t ":" -k "3,3" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mysql:x:27:27::/home/mysql:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
nagios:x:500:500::/home/nagios:/bin/bash
dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
-n 排序字段 按照 数字而不是字符处理
-k "3,3"
[root@aliyun247 ~]# sort -n -t ":" -k "3,3" /etc/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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
mysql:x:27:27::/home/mysql:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
nagios:x:500:500::/home/nagios:/bin/bash
dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash
bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash
3.2 wc 统计命令
wc [选项] 文件名
选项
-l 只统计行数
-w 只统计单词数
-m 只统计字符数
[root@aliyun247 ~]# wc /etc/passwd
29 39 1297 /etc/passwd