正则表达式与通配符
- 通配符
- *0个或一个或多个
- ?任意一个
- []括号中的一个
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配,grep、awk、sed等命令可以支持正则表达式
- 通配符用来匹配符合条件的文件名,通配符是完全匹配,ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配
几个典型事例
- *前一个字符匹配0次或任意多次
- "a*"是无意义的,会把所有匹配出来,包括空白行,匹配所有内容
- "aa*"最少一个a,匹配至少包含一个a的行
- "aaa*"匹配最少两个连续a的字符串
- .匹配除了换行符外任意一个字符(类似?)
- "s..d"s和d这两个字母之间有两个字符的单次
- "s.*d"s和d这两个字母之间有任意字符
- ".*"匹配所有内容
- ^行首
- $行尾
- []匹配中括号中指定的任意一个字符,值匹配一个字符
- [^]取反
- \转义
几个典型应用
- 匹配日期格式 YYYY-MM-DD
[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
复制代码
- 匹配IP地址
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
复制代码
cut [选项] 文件名
- -f 列号:提取第几列
- -d 分隔符:按照指定分割符分割列
grep "/bin/bash" /etc/passwd | grep -v "root" | cut -f 1 -d ":"
复制代码
但是 df -h 不适用,cut只适用特别规律的数据
awk '条件1{动作1}条件2{动作2}...' 文件名
- 条件
- 一般使用关系表达式作为条件
- x > 10判断变量x是否大于10
- 动作
- 格式化输出
- 流程控制语句
ID | Name | gender | Mark |
---|---|---|---|
1 | furong | F | 85 |
2 | fengj | F | 60 |
3 | cang | F | 70 |
awk '{printf $2 "\t" $4 "\n"}' student.txt
// 监控系统资源
df -h | grep "/dev/sda5" | awk '{print $5}' | cut -d "%" -f 1
awk 'BEGIN{print "test"}{print $2 "\t" $4}' student.txt
awk 'END{print "test"}{print $2 "\t" $4}' student.txt
cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'
cat student.txt | grep -v Name | awk '$4>=70{print $2}'
复制代码
sed [选项] '[动作]' 文件名
- 选项
- -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
- -e:允许对输入数据应用多条sed命令编辑
- -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
- 动作
- -a:追加,在当前行后添加一行或多行
- -c:行替换,用c后面的字符串替换原始数据行
- -i:插入,在当前行前插入一行或多行
- -d:删除,删除指定的行
- -p:打印,输出指定的行
- -s:字符串替换,用一个字符串替换另外一个字符串,格式为"行范围s/旧字串/新字串/g"(和vim中的替换格式类似)
sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
//只看第二行
sed -n '2p' student.txt
//删除第二行到第四行的数据,但不修改文件本身
sed '2,4d' student.txt
//在第二行后追加hello
sed '2a piaoliang jiushi rexing' student.txt
//在第二行前插入两行数据
sed '2i meinv' student.txt
//替换第二行数据
sed '2c furong bu ji ge' student.txt
sed '4s/70/100/g' student.txt
复制代码
sort [选项] 文件名
- -f:忽略大小写
- -n:以数值型进行排序,默认使用字符串型排序
- -r:反向排序
- -t:指定分隔符,默认的分隔符是制表符
- -k n[,m]:按照指定的字段范围排序。从第n个字段开始,m字段结束(默认到行尾)
#排序用户信息文件
sort /etc/passwd
#反向排序
sort -r /etc/passwd
#只用第三个字段排序
sort -n -t ":" -k 3,3 /etc/passwd
复制代码
wc [选项] 文件名
- -l:只统计行数
- -w:只统计单词数
- -m:只统计字符数