菜单

Linux查找和筛选工具

2019年6月15日 - 计算机教程

命令中的正则表达式

本文为原创文章,转载请标明出处

 如果要在命令输出或文本中筛选内容时使用模糊查找,就需要使用正则表达式。正则表达式是一套由多个元字符组成的模糊查找模式,使用正则表达式可以快速查找和定位文本中指定的内容。

目录

  1. 文件名通配符
    • 单字符匹配元字符 ?
    • 多字符匹配元字符 *
    • 字符范围匹配符 []
    • 排除范围匹配符 [!]
  2. 命令中的正则表达式
    • 单字符匹配符 .
    • 单字符或字符串重复匹配符 *
    • 行首匹配符 ^
    • 行尾匹配符 $
    • 反斜杠屏蔽符 \
    • 范围匹配符 [] 和排除范围匹配符 [^]
    • 词首词尾匹配符 \< \>
    • 重复次数匹配符 x\{\}
  3. 查找文件工具 find
    • 按文件名查找
    • 按文件权限查找
    • 按文件类型查找
    • 按文件时间戳记查找
    • 按文件大小查找
    • 按文件属主或属组查找
    • 使用 execok 处理查找到的文件
    • 使用 xargs 处理查找到的文件
  4. 查找文本工具 grep
  5. 转换和删除重复命令 tr
  6. 合并和分割工具
    • 排序 sort
    • 数据剪切 cut
    • 数据粘贴 paste
    • 数据连接 join
    • 去除重复 uniq
    • 分割文件 split

 1、单字符匹配符. 

1. 文件名通配符

 正则表达式主要由一些元字符和匹配模式组成 

单字符匹配元字符 ?

匹配任意一个字符

单字符匹配符可以匹配任意单个字符,这个字符的功能和文件名匹配符中的?功能相同

多字符匹配元字符 *

匹配0或1或多个字符

 使用正则表达式查找文本,首先需要使用元字符组成一个查找模式

字符范围匹配符 []

匹配一个字符范围,其表现形式可以是“-”表示的字母和数字的范围,也可以是几个字符的组合

 (1)使用查找模式时,通常将其放入两个斜杠//中,然后再放入命令,例如要在一个文本中查找匹配模式/.i…../,可能选项就有:只要小写字母没有出现在行首,或行尾的最后有5个字符都能匹配 

排除范围匹配符 [!]

不匹配符号内出现的字符组合或字符数字范围

 2、单字符或字符串重复匹配符* 

2. 命令中的正则表达式

 用来匹配单个字符或者一个字符串序列的一次或者多次重复出现 

单字符匹配符 .

匹配任意一个字符

 3、行首匹配符^

单字符或字符串重复匹配符 *

匹配单个字符或一个字符串序列的一次或多次重复出现

  用于在匹配中指示行首位置字符串或者模式,使用时需要将行首匹配符放在要匹配的字符串或模式的前面 

行首匹配符 ^

在匹配中指示行首位置字符串或模式

例如对命令ls -1 使用行首匹配/^1/,结果都是以1开头的

行尾匹配符 $

在匹配中指示行尾位置字符串或模式

 4、行尾匹配符$ 

反斜杠屏蔽符 \

屏蔽一些特殊字符的特殊含义

 用于在文本的每一行的行尾匹配字符串或模式,使用时将行尾匹配符放在字符串或模式后面

范围匹配符 [] 和排除范围匹配符 [^]

与文件名通配符中的范围匹配符和排除范围匹配符用法基本相同

 例如在文本中匹配所有行尾是love的行 

词首词尾匹配符 \< \>

在文本开头或文本结尾匹配与单词开头或单词结尾相匹配的特定的字符串或模式

  /love$/

重复次数匹配符 x\{\}

可以精确匹配字符或字符串连续出现的次数或次数范围

 5、反斜杠屏蔽符\ 

3. 查找文件工具 find

基本格式

# find [path] [expression]

参数:

depth:先从当前目录查找,然后再从当前目录的子目录中查找
maxdepth LEVELS:向下搜索到第LEVELS层目录,LEVELS为0表示只在当前目录查找
mindepth LEVELS:至少向下搜索LEVELS层目录
mount:不搜索远程文件系统
follow:搜索如果遇到链接文件就连同链接所指向的文件一并查找

name:按文件名查找
iname:按文件名查找,不区分大小写
perm:按文件权限查找
tye:按文件类型查找
mtime +n[-n]:按文件内容改变的时间查找,+n表示修改时间距现在n天前,-n表示修改时间距现在n天以内
ctime +n[-n]:按文件属性改变的时间查找
atime +n[-n]:按文件访问的时间查找
size +n[-n]:按文件大小查找,+n表示文件大小大于n,-n表示文件大小小于n,n表示块,1块等于512字节
user:按文件所属主查找
group:按文件所属组查找
nouser:查找没有有效属主的文件
nogroup:查找没有有效属组的文件

prune:不再指定目录中查找
print:将查找的文件输出到标准输出
exec:对查找到的文件执行shell命令
ok:对查找到的文件执行shell命令,在每次执行前提示用户是否执行

 该符用来屏蔽一些特殊字符的特殊含义,常见的特殊字符可能是引用符号,注释符号,通配符和逻辑运算符等,下面列举一些特殊的符号

按文件名查找

如:

# find /etc -name "*.conf"

  注释、分隔符号:#、;等  

按文件权限查找

如:

# find /etc -perm 664

引用符号:$、“402.com,、””等

按文件类型查找

如:

# find /dev -type b

  元字符:.、*、^、$、?、[]、\等 

按文件时间戳记查找

如:

# find /var/log -mtime -1

  逻辑运算符或操作符:||、&&等

按文件大小查找

如:

# find /var/log -size +1M

 在命令中使用这些字符时,都要使用反斜杠将其特殊含义屏蔽 

按文件属主或属组查找

如:

# find / -user root

 例如使用乘法符号*做乘法运算,就要用反斜杠将其特殊含义屏蔽在做使用 

使用 execok 处理查找到的文件

如:

# find /var/log -size +1M -exec ls -l {} \;

  # expr 256 \* 256 

使用 xargs 处理查找到的文件

如:

# find ~/ -name "test.txt" | xargs rm

 6、范围匹配符[]和排除范围匹配符[^]

4. 查找文本工具 grep

grep:global regular expression print 全局正则表达式打印

# grep [option] [pattern] [file]

参数

i:忽略大小写
n:将结果输出的同时,也输出该行行号
s:在没有查找到匹配的内容时,不显示错误信息
l:从多个文件中查找时,只输出找到匹配内容的文件名称
h:从多个文件中查找时,只输出匹配的内容,不显示文件名称
c:只输出匹配内容的总行数
v:反转查找,即输出匹配内容以外的行

例如:

查询来自云南和河南的学生信息
# grep -E 'Yunnan|Henan' students

 与文件名通配符中的范围匹配符用法基本相同  

5. 转换和删除重复命令 tr

# tr [option] [string1] [string2]

参数

c:使用string1中字符的补集替换
d:删除string1中包含的所有字符
s:删除重复字符

例如:

小写转大写
# tr -s "a-z" "A-Z" <test
删除所有重复字母
# tr -s "[a-z][A-Z]"

    (1)匹配单词love和Love:

6. 合并和分割工具

  /[L]ove/ 

排序 sort

# sort [option] [file]

参数

b:按字段进行分类并忽略前面的空格或制表符
d:按字典的顺序进行排序,将除空格和字母以外的字符排除
f:忽略大小写
g:根据数值进行排序
i:只考虑可打印的字符
M:将字符按月份进行比较,例如JAN<...<DEC
n:按数值进行比较排序
r:返向排序
c;测试文件内容是否已经进行了排序,若无任何返回信息,则表示已经执行了排序操作
k:指定排序的关键字
m:合并已经排序的文件,不进行排序
o:将结果写入文件,不再输出到标准输出上
s:通过屏蔽最后的分类比较稳定排序
t:使用指定的字符作为字段分隔符
T:将临时文件放入指定的目录内
u:如果与参数c一起使用,则检查是否在排序时已经去除重复的行,没有参数c时,则在排序时去掉重复行
z:用一个0字节作为结束,而不是一个换行符

例如:

对students文件第5个字段第8个字符按数字从大到小排序
# sort -k5.8nr students
先对students文件第5个字段排序,再按第10个字段排序
# sort -k 5,10n students
指定“#”作为字段分隔符,并对students文件第三个字段进行排序
# sort -t# -k3 students
合并students1,students2到students_new
# sort -m students1 students2 >students_new

     (2)不匹配所有的字母:

数据剪切 cut

cut [option] [file]

参数

b:表示要操作的对象是字节
c:表示要操作的对象是字符
f:表示要操作的对象是字段
d:指定字段分隔符,默认情况下是制表符tab
s:表示不包括没有字段分隔符的行

N:表示第N个字节
N-:表示从N到一行结束的内的所有文本
N-M:表示从N到M之间的所有文本
-M:表示从开始到M之间的所有文本
-:从开始到结束的所有文本

例如:

剪切students文件所有行的前10个字符
# cut -b-10 students
以“#”为分隔符,并对students文件第1,2,4个字段进行剪切
# cut -d# -f1-2,4 students

  [^a-z]

数据粘贴 paste

paste [option] [file...]

参数

d:对新生成的文本指定新的字段分隔符,默认情况下是制表符tab
s:横向粘贴,默认纵向粘贴

例如:

纵向粘贴paste1,paste2文件
# paste paste1 paste2

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图