文件内容查找学习
说明
对于文件内容的查找,linux上主要有3个命令,可进行查找定位,每个命令的侧重方向不一样。
grep就是在茫茫字符串中找到目标字符串,并且能够进行一定的统计取反等。但是不能对文件内容进行删除,替换,修改,统计个数,对提取的字符串进行执行命令等等。
sed命令,理论上, 我觉得是能够它直接代替grep,因为sed的功能是能够覆盖grep的。在grep的基础上,增加了对文件内容的增删改的功能
awk的命令就更加强大了,我觉得,这个awk命令,我觉得能够顶替grep和sed,因为awk的命令包含了grep和sed的所有功能,而且更加灵活。
一.grep
grep是用来抓取目标字符串,如果对这个目标字符串有特殊的需求,需要处理,可以使用选项中的命令,最为重要的是,它可以使用正则表达式,一旦能够使用正则表达式,就意味着,没有它找不到的字符串。正则表达式,真是牛逼。
1.grep的命令格式
grep [选项] [要查询的字符串] [在哪个文件查询]
grep的选项也是非常多,但是常用的就是那么几个。
选项 含义 功能描述
-i ignore case 忽略大小写
-v invert match 不匹配匹配的
-l file-with-match 输出匹配的文件名
-L file-without-match 输出不匹配的文件名
-c count 输出匹配的数目(行数)
-n number 输出匹配行的同时在前面加上文件名及在文件名中的行数
-h no-filename 抑制文件名的输出
举例说明:
2.正则表达式
3.与find结合使用
二.sed
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed命令可以用来查看,编辑文本文件
sed命令实在是多,多到让人眼花缭乱,我觉得首先明白,sed命令涵盖grep的功能,在这个基础上,又额外增加了几种功能,比如能够对文件进行增加,插入,删除,修改,替换等操作。我感觉最牛的功能,可能是替换。
下面,我会从3个方面来说,原理,常规用法,正则表达式
1.sed的原理
非交互式就是指sed只能够在命令行下输入编辑命令来对文本进行编辑,然后在屏幕上查看输出。
流式是指sed每次只从文件中读入一行,然后对该行进行指定的处理,并将处理结果输出到屏幕上,处理完后在读入下一行。
sed对文本的过程处理如下(一切尽在不言中,需细看):
2.sed的命令格式及其常规用法
sed命令格式
sed [选项] ‘command’ 文件名称
格式中的常见选项命令
选项部分,常见选项包括-n,-e,-i,-f,-r选项。
1.选项-n
-n或–quiet或–silent 仅显示script处理后的结果。
2.选项-e
如果需要用sed对文本内容进行多种操作,则需要执行多条子命令来进行操作。
例子1
echo -e 'hello world' | sed -e 's/hello/A/' -e 's/world/B/'
结果:A B
例子2:
echo -e 'hello world' | sed 's/hello/A/;s/world/B/'
结果:A B
3.选项-i
sed默认会把输入行读取到模式空间,简单理解就是一个内存缓冲区,sed子命令处理的内容是模式空间中的内容,而非直接处理文件内容。因此在sed修改模式空间内容之后,并非直接写入修改输入文件,而是打印输出到标准输出。如果需要修改输入文件,那么就可以指定-i选项。
cat file.txt
hello world
[root@localhost]# sed 's/hello/A/' file.txt
A world
[root@localhost]# cat file.txt
hello world
[root@localhost]# sed -i 's/hello/A/' file.txt
[root@localhost]# cat file.txt
A world
4.选项-f
以选项中指定的script文件来处理输入的文本文件。
echo "hello world" | sed -f sed.script
结果:A B
sed.script脚本内容:
s/hello/A/
s/world/B/
说明:在脚本文件中的子命令串就不需要输入单引号了。
5.选项-r
sed命令的匹配模式支持正则表达式的,默认只能支持基本正则表达式,如果需要支持扩展正则表达式,那么需要添加-r选项。
例子1:
echo "hello world" | sed -r 's/(hello)|(world)/A/g'
A A
格式中的常见command
对文件内容进行增加插入删除修改替换等操作
1.新增a
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
首先查看testfile中的内容如下:
$ cat testfile #查看testfi`le 中的内容
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
使用sed命令后,输出结果如下:
$ sed -e 4a\newline testfile #使用sed 在第四行后添加新字符串
HELLO LINUX! #testfile文件原有的内容
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newline
2.删除d
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后面省略).....
3.插入i
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
5.取代c
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
6.取代s
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
三.awk
awk命令开始看的时候,有点懵,后面多看几次,就明白,感觉这个命令挺牛逼的。这个命令感觉就像是处理数据库表,有行有字段,awk会通过用户给定的分隔符,将文件的每行内容分成列,这样根据行号和列号,可以定位到每个元素。对于字符串的处理粒度更小更精准,并且能够对目标字符串进行统计,或者对目标字符串运行命令等等。awk命令真心非常强大,瞬间觉得grep和sed不香了。
正因为awk命令真的太强大了,用法非常非常多。
1.awk的原理
命令结构:
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
1、通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。
2、完成 BEGIN 块的执行,开始执行body块。
3、读入有 \n 换行符分割的记录。
4、将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容),
1
表
示
第
一
个
域
,
1 表示第一个域,
1表示第一个域,n 表示第 n 个域。
5、依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行 awk-commands 的内容。
6、循环读取并执行各行直到文件结束,完成body块执行。
7、开始 END 块执行,END 块可以输出最终结果。
2.AWK用法
直接阅读https://www.cnblogs.com/jxhd1/p/6271179.html
讲非常全面,也非常系统
参考链接
1.grep相关
https://www.runoob.com/linux/linux-comm-grep.html
https://www.linuxprobe.com/linux-grep-rex.html
https://www.cnblogs.com/zhanzhuang/p/10275672.html
2.sed相关
https://www.runoob.com/linux/linux-comm-sed.html
https://www.linuxprobe.com/linux-sed-command.html
下面这篇文章,关于sed定址这块讲的不错,值得细看
https://www.cnblogs.com/hb91/p/9974951.html
3.awk相关,这篇文章有点牛逼,说明awk,真是非常详细啦
https://www.cnblogs.com/jxhd1/p/6271179.html
4.awk的工作原理
https://www.runoob.com/w3cnote/awk-work-principle.html