正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割,匹配,查找及替换操作.
正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.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 [选项参数] 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
一个强大的文本分析工具,把文件逐行的读入,以空格
或tab键
为默认分隔符
将每行切片,切开的部分再进行分析处理.
在awk命令的输出中支持print
和printf
命令.
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 [选项] '[动作]' 文件名
选项参数 | 功能 |
---|---|
-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(选项)(参数)
选项 | 说明 |
---|---|
-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 [选项] 文件名
选项 | |
---|---|
-l | 只统计行数 |
-w | 只统计单词数 |
-m | 只统计字符数 |
wc 文件名
统计行数,单词数和字符数.