Cirry's Blog

Shell 编程——正则表达式(14)

2016-08-07
linux
5分钟
890字

正则表达式:用于描述字符排列和匹配模式的一种语法规则,它主要是用于字符串的模式分割,匹配,查找以及替换操作

匹配是包含匹配:grep,awk,sed 支持正则

通配符是完全匹配,ls,find,cp 不支持正则

基础正则表达式:

vim test.txt

grep “aa*” test.txt

”*“前一个字符匹配0次,或任意多次

“a*” #匹配所有内容,包括空白行

“aa*” #匹配至少包含有一个a 的行

“aaa*” #匹配至少包含有两个a 的行

”.” #匹配除了换行符以后任意一个字符

grep “s..d” test.txt

grep “s.*d” test.txt

”^” 匹配行首 ”$” 匹配行尾

1
grep "^s" test.txt
2
grep "^a" test.txt
3
grep "b$" test.txt
4
5
grep -ll "^s" test.txt

”[]“与通配符中的”[]” 作用一致

grep ”^[0-9]” test.txt

”[^]” 匹配符中括号的字符以外的任意一个字符

1
grep "[^a-z]" test.txt
2
grep "^[^a-z]" test.txt
3
#匹配不用小写字母开头的行
4
5
grep "^[^a-zA-Z]" test.txt
6
#匹配不用字母开头的行

""转义符

“.$” #匹配使用 ”.” 结尾的行

1
grep ".$" test.txt #(x)
2
grep "\.$" test.txt #(√)

“{n}“表示其前面的字符恰好出现n次

“a{3}” #匹配a 字母至少重复3次

“[0-9]{3}” #匹配包含连续的三个数字的字符串

1
grep "a\{3\}" test.txt
2
grep "c\{3\}u" test.txt

“{n,}” 表示其前面的字符出现不小于n次

”^[0-9]{3,}[a-z]”

#匹配最少用连续三个数字开头的行

grep “xc{3}n” test.txt

“{n,m}” 匹配其前面的字符至少出现n次,最多出现m次

“sa{1,3}i”

#匹配在字母s字母i之间有最少一个a,最多有三个a

正则表达式案例

[0-9{4}-[0-9]{2}-[0-9]{2}]

#匹配日期格式YYYY-MM-DD

[0-9]{1,3}.[0-9]{1,3}.[0-9]{.3}.[0-9]{1,3}

#匹配ip地址

grep命令

字符截取命令

cut 字段提取命令

1
grep "/bin/bash" /etc/passwd
2
grep "/bin/bash" /etc/passswd | grep -v "root"

grep 行提取命令

cut 列提取命令

cut [选项] 文件名

选项:

-f:列号:提取第n列 -d:分隔符,按照指定分隔符分割列

1
vi student.txt
2
ID Name Gerden Mark
3
1 furong F 85
4
2 fengjie F 60
5
3 cangls F 70
1
cut -f 2 student.txt
2
cut -f 2,4 student.txt
3
4
grep "/bin/bash" /etc/passwd/ | grep "root" | cut -f 1 -d ":"
5
6
cut -d ":" -f 1,3 /etc/passwd

cut命令的局限

df -h | cut -d "" -f 1,3

printf命令:格式化输出命令

printf”输出类型输出格式”

输出类型:

  • -%ns:输出n个字符串
  • -%ni:输出n个数字
  • -%m.nf:输出浮点数

%8.2f : 输出8位数,小数2位,整数6位

输出格式:

1
\a
2
\b
3
\f #清屏
4
\n
5
\r #回车
6
\t
7
\v # 垂直输出退格键 tab
1
printf 1 2 3 4 5 6
2
printf %s 1 2 3 4 5 6
3
printf %s %s %s 1 2 3 4 5 6
4
printf '%s %s %s' 1 2 3 4 5 6
5
printf '%s' $(cat student.txt)

在awk 命令的输出中支持printf 和print命令

print:每个输出之后自动加入一个’\n’ (linux,默认没有print命令)

printf:标准格式输出命令,并不会自动加入’\n’ ,如果需要换行手工添加

awk命令

awk ‘条件1{动作1}条件2{动作2}…’

条件(pattern):

-一般使用关系表达式作为条件

-x>10判断变量x 是否大于10

动作(action)

-格式化输出

-流程控制语句

1
awk '{printf $"\t"$4"\n"}' student.txt
2
df -h | awk '{print $1 "\t" $3}'
3
df -h | grep "/dev/sda5/" | awk '{printf $5 "\n"}' | cut -d "%" -f

BEGIN条件:

awk ‘BEGIN{printf “This is a transcript “\n""}{printf $2 “\t” $4 “\n”}’ student.txt

END条件:(同上)

FS内置变量:

1
cut /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
2
cut /etc/passwd | grep "/bin/bash" | awk '{FS=":"}{printf $1 "\t" $3}'
3
cut /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'

关系运符

1
cut student.txt | grep -v Name | awk '$4'>=70 {pritnf $2 "\n"}'
本文标题:Shell 编程——正则表达式(14)
文章作者:Cirry
发布时间:2016-08-07
感谢大佬送来的咖啡☕
alipayQRCode
wechatQRCode