文本处理三剑客以及配合正则表达式使用范例以及find

文本处理三剑客以及配合正则表达式使用范例以及find

1、grep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2、grep主要参数
[options]主要参数:
-a或–text 不要忽略二进制的数据。
-A<显示列数>或–after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之后的内容。
-b或–byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
-B<显示列数>或–before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。
-c或–count 计算符合范本样式的列数。
-C<显示列数>或–context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作>或–directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式>或–regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。
-E或–extended-regexp 将范本样式为延伸的普通表示法来使用。
-f<范本文件>或–file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
-F或–fixed-regexp 将范本样式视为固定字符串的列表。
-G或–basic-regexp 将范本样式视为普通的表示法来使用。
-h或–no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H或–with-filename 在显示符合范本样式的那一列之前,表示该列所属的文件名称。
-i或–ignore-case 忽略字符大小写的差别。
-l或–file-with-matches 列出文件内容符合指定的范本样式的文件名称。
-L或–files-without-match 列出文件内容不符合指定的范本样式的文件名称。
-n或–line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。
-q或–quiet或–silent 不显示任何信息。
-r或–recursive 此参数的效果和指定“-d recurse”参数相同。
-s或–no-messages 不显示错误信息。
-v或–revert-match 反转查找。
-V或–version 显示版本信息。
-w或–word-regexp 只显示全字符合的列。
-x或–line-regexp 只显示全列符合的列。
-y 此参数的效果和指定“-i”参数相同。
–help 在线帮助。
3、grep实用案例
1、搜寻1.txt文件中字符串"the" 注: n为显示行号 grep -n ‘the’ regular_express.txt
2、反向搜寻特定字符串"the" grep -vn ‘the’ regular_express.txt
3、取得任意大小写"the"的这个字符串 # grep -in ‘the’ regular_express.txt
4.利用括号 [] 来搜寻集合字符 搜索test或taste这两个单词
grep -n ‘t[ae]st’ regular_express.txt
这样其实就是在找t[a]st和t[e]st这两个分开的字符
第4题延伸:
如果搜索有 oo 的字符时,则可以使用:# grep -n ‘oo’ regular_express.txt
如果搜索oo时不想搜到 oo 前面有 g 的话,我们可以利用反向选择[^]来达成:
grep -n ‘[^g]oo’ regular_express.txt
如果搜索oo前面不想有小写字符,则:grep -n ‘[^a-z]oo’ regular_express.txt
注: 大写英文/小写英文/数字 可以使用 [a-z]/[A-Z]/[0-9]等方式来书写,也可以写在一起[a-zA-Z0-9]表示要求字符串是数字以及英文
如果我们要取得有数字的那行,则:# grep -n ‘[0-9]’ regular_express.txt
5、显示行首为’the’的字符串 # grep -n ‘^the’ regular_express.txt
6、显示行首是小写字符 grep -n ‘^ [a-z]’ regular_express.txt
7、显示行尾为点 . 的那一行 grep -n ‘.$’ regular_express.txt
8、显示5-9行数据 cat -An regular_express.txt |head -n 10 |tail -n 6
nl 9.txt|grep ‘^\s+5’ -A 4
9、找出g??d字符串,起头g结束d的四个字符串 grep -n ‘g…d’ regular_express.txt
10、o代表空字符(就是有没有字符都可以)或者一个到N个o字符,所以
grep -n 'o
’ regular_express.txt就会把所有行全部打印出来,
11、.oo代表o+空字符或者一个到N个o字符,所以grep -n 'oo’ regular_express.txt就会把o,oo,ooo等的行全部打印出来
12、"goog"代表gog,goog,gooog…等 grep -n 'goog’ regular_express.txt
13、找出含g…g字符串的行grep -n ‘g.*g’ regular_express.txt
14、找出含有数字的行 grep -n ‘[0-9]+’ regular_express.txt 或
grep -n ‘[0-9]’ regular_express.txt

15、找出含两个o的字符串 grep -n ‘o{2}’ regular_express.txt
16、找出g后含2到5个o然后以g结尾的字符串
grep -n ‘go{2,5}g’ regular_express.txt
17、找出g后含2以上的o然后以g结尾的字符串
grep -n ‘go{2,}g’ regular_express.txt

4、grep 与管道
grep 的输入不一定都是文件,它也常常从管道读取输入
[root@yum test]# ls
grep.txt sed1.txt sed2.txt sed.txt
[root@yum test]# ls | grep “grep”
grep.txt
[root@yum test]# ls | grep “^gr”
grep.txt
说明:
ls 的命令的输出通过管道传给 grep。输出结果字母 gr 开头的所有行都被打印出来了,
也就是说,被选中的目录被打印出来了
注意:经过测试\d不能使用如果想使用数字用[0-9] 还有,要使用正则表达式的?+ {}记得前边加
5、sed简介
sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。
6、sed 工作过程
sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed 的命令就是在 vi和 ed/ex 编辑器中见到的那些。sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把该行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。sed 每处理完输入文件的最后一行后,sed 便结束运行。sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。如图 1:sed 处理过程。

在这里插入图片描述
从上图可以看出 sed 不是破坏性的,它不会修改正在编辑的文件。
7、sed命令使用
常用选项:
-n 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行
-e 多重编辑,且命令顺序会影响结果
-f 指定一个 sed 脚本文件到命令行执行,
-r Sed 使用扩展正则
-i 直接修改文档读取的内容,不在屏幕上输出
Sed操作命令
sed 操作命令告诉 sed 如何处理由地址指定的各输入行。如果没有指定地址,sed 就会处理输入的所有的行
x:指定行号。
x,y:指定从x到y的行号范围
/ pattern/:查询包含模式的行 # # % %
/ pattern/ pattern/:查询包含两个模式的行
/ pattern/,x:从与 pattern的匹配行到x号行之间的行
x,/ pattern/:从x号行到与 pattern的匹配行之间的行
x,y!:查询不包括x和y行号的行
r:从另一个文件中读文件
w:将文本写入到一个文件
y:变换字符
q:第一个模式匹配完成后退出
l:显示与八进制ASCⅡ码等价的控制字符
{}:在定位行执行的命令组
p:打印匹配行
=:打印文件行号。
a:在定位行号之后追加文本信息
i:在定位行号之前插入文本信息。
d:删除定位行
c:用新文本替换定位文本
s:使用替换模式替换相应模式
n:读取下一个输入行,用下一个命令处理新的行
N:将当前读入行的下一行读取到当前的模式空间。
h:将模式缓冲区的文本复制到保持缓冲区
H:将模式缓冲区的文本追加到保持缓冲区
x:互换模式缓冲区和保持缓冲区的内容
g:将保持缓冲区的内容复制到模式缓冲区
G:将保持缓冲区的内容追加到模式缓冲区。
删除
1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示
nl /etc/passwd | sed ‘2,5d’
注: sed是sed -e的简写, 后接单引号
2.同上删除第2行 nl /etc/passwd | sed ‘2d’
3.同上删除第三行到最后一行 nl /etc/passwd | sed ‘3,KaTeX parse error: Expected group after '^' at position 20: … 4.删除批注行 sed '/^̲#.*/d' /etc/ini…/d’
插入
4.在第二行后加上一行test nl /etc/passwd | sed ‘2a test’
5. 在第二行前加上一行test nl /etc/passwd | sed ‘2i test’
6. 在第二行后加入三行test nl /etc/passwd|sed ‘2a ttttttt\ndddd\nhhh’
替换
6.将2-5行内容取代为 No 2-5 number nl /etc/passwd | sed ‘2,5c No 2-5 number’
7.把9.txt 文件中 old 替换为new
Sed ‘s/old/new/g’ 9.txt # s///g 内容替换g全局替换
8.在一行的内容前边添加内容
sed ‘/good/ s/^/&word/g’ 9.txt #<== /good/会匹配特定的内 容,然后对匹配到的行进行s/KaTeX parse error: Expected 'EOF', got '&' at position 2: /&̲word/g 替换操作 ,&的…/&word/g’ 9.txt #<== /good/会匹配特定的内 容,然后对匹配到的行进行s/$/&word/g 替换操作 ,&的意思追加
打印
8. 列出/etc/passwd 内第5-7行 nl /etc/passwd |sed -n ‘5,7p’
查询
9.获取本机IP的行 /sbin/ifconfig eth0 |grep ‘inet addr’

10.将IP前面的部分予以删除 /sbin/ifconfig eth0 |grep ‘inet addr’| sed ‘s/^.addr://g’
11.将IP后面的部分删除
/sbin/ifconfig eth0 |grep ‘inet addr’| sed ‘s/^.addr://g’| sed 's/Bcast:.$//g’
/sbin/ifconfig eth0| sed -n '/^\s
inet addr/p’|sed ‘s/^\sinet addr://g’|sed 's/Bcast:.//g’

12.用grep将关键词MAN所在行取出来 cat /etc/man.config |grep ‘MAN’

例题:
(1)替换 1.txt文本中old为new,代码如下
sed 's/old/new/g ’ 1. txt
(2)打印 1. txt文本第一行至第三行,代码如下
Sed -n ‘1,3p’ 1.txt
(3)打印 1.txt文本中第一行与最后一行,代码如下
Sed -n ‘1p; $p’ 1.txt
(4)删除 1.txt第一行至第三行、删除匹配行至最后一行,代码如下
Sed ‘1,3d’ 1.txt
Sed ‘/aaaa/, $d’ 1.txt
通常而言,sed将待处理的行读入模式空间,脚本中的命令逐行进行处理,直到脚本执
行完毕,然后该行被输出,模式空间清空,然后重复刚才的动作,文件中的新的一行被读入
直到文件处理完备
如果用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以
便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行,这时可
以使用sed高级语法来满足用户需求。总的来说,sed高级命令可以分为以下3种功能
N、D、P:处理多行模式空间的问题
H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑
:、a:b、t在脚本中实现分支与条件结构
(1)在1.txt每行后加入空行,也即每行占用两行空间,每一行后边插入一行空行两行空行及前三行每行后插入空行,代码如下
sed ‘/^ $/d; G’ 1.txt
sed ‘/^ $/d; G; G’ 1.txt
sed ‘/^ KaTeX parse error: Expected group after '^' at position 268: …行,代码如下: sed '/^̲/d; G’ 1.txt
(5)在jedu.txt每行后加入两行空行,也即每行占用三行空间,每一行后边插入空行代码如下
sed ‘/^ $/d; G;’ 1.txt
(6)在 jiedu.txt每行前加入顺序数字序号、加上制表符“\t”"及“,”符号,代码如下
sed = 1.txt| sed ‘N; s/\n/ /’
sed = 1.txt| sed ‘N; s/\n/\n/\t’
sed = 1.txt| sed ‘N; s/\n/\ ./’
(7)删除 ifed.txt行前和行尾的任意空格,代码如下
sed 's / ^ [ \ t ] * / / ; s / [ \ t ] * $/ / ’ 1.txt
(8)打印 fedu. txt关键词old与mew之间的内容,代码如下:
sed -n 'old/,/new/‘p 1.txt
(9)打印及删除 ifed.:最后两行,代码如下
sed ’ $ !N; $!D’ 1.txt
sed ‘N; $!p; $!D; d ′ 1. t x t ( 10 ) 合 并 上 , 下 两 行 , 也 即 两 行 合 并 , 代 码 如 下 s e d ′ d&#x27; 1.txt (10)合并上,下两行,也即两行合并,代码如下 sed &#x27; d1.txt(10),,,sed!N; s/\n/ /’ 1.txt
sed ‘N; s/\n/ /’ 1.txt

3、find
find命令用于查找指定目录下的文件,同时也可以调用其它命令执行相应的操作
Linux中find常见用法find path -option [ -print ] [ -exec -ok command ] {} ;
find命令的参数;
path: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以内,+n指n天以前
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #按文件大小查找
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录
-amin      # 查找在系统中最后N分钟访问的文件
-mmin      # 查找在系统中最后N分钟里修改过的文件
实例
(1)find工具name参数案例,详解如下
find /data/ -name ".txt”":查找/data/目录以.txt结尾的文件
find /data/ -name "[A-Z]
”:查找/data/目录以大写字母开头的文件
find /data/ -name “test*”:#查找/data/目录以test开头的文件
(2)find工具-type参数案例,详解如下
fnd/data/ -type d:查找/data/目录下的文件夹
find/ data/ ! -type d:查找/data/目录下的非文件夹
find/data/- type l:查找/data/目录下的链接文件
find/data/ - type d |xargs chmod 755 -R:查找目录类型并将权限设置为755
find/data/- type f |xargs chmod 644-R:查找文件类型并将权限设置为644
(3)find工具size参数案例,详解如下
find /data/ -size +1M:查找文件大小大于1MB的文件
find /data/ -size 10M:查找文件大小为10MB的文件。
find /data/ -size -1M:查找文件大小小于1MB的文件。
(4)find工具-perm参数案例,详解如下:
Find /data/ -perm 755:查找/data/目录权限为755的文件或者目录
Find /data/ -perm -775:权限小于775的文件或目录
Find /data/ -perm +644:查找文件权限符号为644以上的文件
(5)find工具mime参数案例,详解如下
atime, access time:文件被读取或者执行的时间
ctime, change time:文件状态改变时间
mtime, modify time:文件内容被修改的时间
Find /data/ -mtime +30-name “.log":查找30天以前的log文件
Find /data/ -mtime -30 -name ““.txt”:查找30天以内的txt文件
Find /data/ -mtime 30 -name " .txt":查找第30天的txt文件
find /data/ -mmin +30-name ".log”:查找30min以前被访问的log文件
find /data/ -amin -30-name ".log”:查找30min以内被访问的log文件
find /data/ -cmin 30-name ".log”:查找第30min改变的log文件
(6)find工具参数综合案例,代码如下
查找/data目录以,.log结尾,文件大于10KB的文件,同时/cp到/tmp目录
find /data/ -name "
. log” -type f -size +10k -exec cp {} /tmp/ ;
查我/data/目录以结尾,文件大于10kB的文件,权限为644并别除该文件
find /data/ -name "
.log” -type f -size +10k -m perm 644 -exec rm -rf {} ;
查找/data/目录以.log结尾,30天以前的文件,大小大于10并移动到/temp目录
find /data/ -name " . log” -type f -mtine +30 -size +10M -exec mv {} /temp/
xargs:
4、awk
awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。awk 是三剑客的老大,利剑出鞘,必会不同凡响。
1、awk 的原理
通过一个简短的命令,我们来了解其工作原理。
awk ‘{print $0}’ /etc/passwd
echo hhh|awk ‘{print “hello,world”}’
awk ‘{ print “hiya” }’ /etc/passwd
通过第一个指令你将会见到/etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk时,我们指定/etc/passwd 作为输入文件。执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与执行 cat /etc/passwd 完全相同。现在,解释{ print }代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容

通过一个简短的命令,我们来了解其工作原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值