Linux Shell中的正则表达式

Linux Shell中的正则表达式

    • 正则表达式是什么
      • 正则表达式
      • 通配符
    • cut命令
    • awk命令
    • sed
    • sort排序命令
    • wc统计命令

正则表达式是什么

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

正则表达式

正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep,awk,sed等命令可以支持正则表达式.

元字符 作用
* 前一个字符匹配0次或任意多次 ,例如:a.*d会匹配a和d之间有任意字符
. 匹配除了换行符外的任意一个字符,例如:a..d会匹配在a和d这两个字母之间有两个字符的单词
^ 匹配行首.例如:^hello会匹配以hello开头的行
$ 匹配行尾.例如:world$会匹配以world结尾的行,^$会匹配空白行
[ ] 匹配括号中指定的任意一个字符,只匹配一个字符.例如[abcde]只匹配其中的任意一个字母
[^] 匹配除中括号的字符以外的任意一个字符.例如:[^0-9]匹配任意一个非数字字符
\ 转义符,例如:\.$匹配.结尾的行
\{n\} 表示其前面的字符出现n次.例如:[0-9]\{4\}匹配4位数字
\{n,\} 表示其前面的字符出现不小于n次.例如:[a-z]\{4,\}匹配4位及以上的小写字母
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次.

通配符

通配符用来匹配符合条件的的文件名,通配符是完全匹配.ls,find,cp这些命令不支持正则表达式,所以只能使用Shell自己的通配符来进行匹配.

* 匹配任意字符串,包括空字符串
? 匹配任意一个字符
[…] 匹配任意字符

cut命令

cut的工作就是’剪’,就是在文件中负责剪切数据用的.cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出.
cut [选项参数] filename
说明:默认分隔符是制表符(tab键)

选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
[root@localhost myshell]#touch cut.txt
[root@localhost myshell]#vim cut.txt
#切割cut.txt第一列
[root@localhost myshell]#cut -d " " -f 1 cut.txt
#切割cut.txt第二,三列
[root@localhost myshell]#cut -d " " -f 2,3 cut.txt
#在cut.txt文件中切割出guan
[root@localhost myshell]#cat cut.txt | grep "guan" |cut -d " " -f 1

awk命令

一个强大的文本分析工具,把文件逐行的读入,以空格tab键为默认分隔符将每行切片,切开的部分再进行分析处理.
在awk命令的输出中支持printprintf命令.
1.print会在每个输出之后自动加入一个换行符(Linux中默认没有print命令)
2.printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符.
awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename
pattern表示awk在数据中查找的内容,就是匹配模式(也可以是条件,一般使用关系表达式作为条件)
action在找到匹配内容时所执行的一系列命令

选项参数 功能
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
//#搜索passwd文件以root关键字开头的所有行,并输出该行的第7列
[root@localhost myshell]#awk -F":" '/^root/{print $7}' /etc/passwd
//#搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以","号分割
//#注意:只有匹配了pattern的行才会执行action
[root@localhost myshell]#awk -F: '/^root/{print $1","$7}' /etc/passwd
//#只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列明user,shell在最后一行添加"endend"
//#注意:先执行BEGIN模式中指定的动作,再处理指定的文本,最后再执行END模式中指定的动作
[root@localhost myshell]#awk -F: 'BEGIN{print "user shell"} {print $1","$7} END{print "endend"}' /etc/passwd
//#将passwd文件中的用户id增加数值1并输出
[root@localhost myshell]#awk -v i=1 -F: '{print $3+i}' /etc/passwd

awk的内置变量

变量 说明
FS 列分隔符,与-F作用相同
FILENAME 文件名
NR 已读的记录数(也就是当前处理行的行号)
NF 浏览记录的域的个数(切割后,列的个数,也就是当前处理行的列数)
$0 整行内容
$n 第n列
RS 行分隔符,默认值是\n
#统计passwd文件名,每行的行号,每行的列数
[root@localhost myshell]#awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF}' /etc/passwd
#切割IP
[root@localhost myshell]#ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}'
#查询sed.txt中空行所在的行号
[root@localhost myshell]#awk '/^$/{print NR}' sed.txt
#以:为分隔符分割列,再查找以root开头的行,最后打印第1和第3[root@localhost myshell]#awk 'BEGIN{FS=":"} /^root/{print $1"\t"$3}' /etc/passwd
[root@localhost ~]# cat student.txt
name    grade    sex
zhangsan	59	nv
lisi	98    nan
wangwu	75	nv
xiaoer	47	nv
#grep -v name表示查找不包含name的行,-v表示取反
[root@localhost ~]# cat student.txt | grep -v name | awk '$2>=60{print $1"\t"$2}'
lisi	98
wangwu	75
[root@localhost ~]# awk 'BEGIN{print "test"} $2<60{print $1,$2} END{print "bujige"}' student.txt
test
zhangsan 59
xiaoer 47
bujige

sed

sed是一种流编辑器,它一次处理一行内容.处理前,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.
sed [选项] '[动作]' 文件名

选项参数 功能
-n 一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕
-e 允许对输入数据应用多条sed命令编辑
-i 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作 功能描述
a 追加,在当前行后添加一行或多行
c 行替换,用c后面的字符串替换原数据行
i 插入,在当前行前插入一行或多行
d 删除,删除指定的行
s 查找并替换,格式:行范围s/旧字符串/新字符串/g
p 打印,输出指定的行,一般和-n配合使用(若是不加-n则会全部打印,指定的行会打印一次)
[root@localhost myshell]#vim sed.txt
#将"hello world"这个字符串插入到sed.txt第二行下面(第三行),打印
[root@localhost myshell]#sed '2a helloworld' sed.txt
#删除sed.txt文件所有包含wo的行
[root@localhost myshell]#sed '/wo/d' sed.txt
#删除第2行到第四行的数据,但不修改文件本身
[root@localhost myshell]#sed '2,4d' sed.txt
#将sed.txt文件中wo替换成ni
注意:'g'表示global,全部替换
[root@localhost myshell]#sed "s/wo/ni/g" sed.txt
#将sed.txt文件中的第二行删除并将wo替换为ni
[root@localhost myshell]#sed -e "2d" -e "s/wo/ni/g" sed.txt
#在第3行中,60换成88
[root@localhost myshell]#sed '3s/60/88/g' sed.txt
#将sed操作的数据直接写入文件(此时修改了文件)
[root@localhost myshell]#sed -i '3s/60/88/g' sed.txt
#同时把88"wo"替换为空
[root@localhost myshell]#sed -e 's/88//g;s/wo//g' sed.txt

sort排序命令

sort命令将文件进行排序,并将排序结果标准输出
sort(选项)(参数)

选项 说明
-f 忽略大小写
-n 以数值型进行排序(不加-n选项时默认使用字符串型排序)
-r 以相反的顺序来排序
-t 设置排序时所用的分隔符,默认的分隔符是制表符
-k n[,m] 按照指定的字段范围排序.从第n字段开始,m字段结束(默认到行尾)

参数:指定待排序的文件列表

[root@localhost myshell]#vim sort.sh
#按照":"分割后的第三列倒序排序
[root@localhost myshell]#sort -t : -nrk 3 sort.sh
#指定分隔符是":",用第三字段开头,第三字段结尾排序,就是只用第三字段排序
[root@localhost myshell]#sort -t ":" -k 3,3 /etc/passwd

wc统计命令

wc [选项] 文件名

选项
-l 只统计行数
-w 只统计单词数
-m 只统计字符数

wc 文件名统计行数,单词数和字符数.

你可能感兴趣的:(笔记,正则表达式,linux,前端)