13、Linux文本三剑客

发布时间 2023-10-22 08:48:09作者: gcc_com

Linux文本三剑客

都要最基本的功能--查看

以列为单位查看的话awk命令更快;以行为单位查看的话sed命令更好;查看某个字段以grep更方便。

一、grep命令

Linux grep命令用于查找文件里符合条件的字符串。grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 - ,则grep指令会从标准输入设备读取数据。

有时候我们发现并不需要列出文件的全部内容,而是从文件中找到包含指定信息的那些行,要实现这个目的,可以使用grep命令。英文 global regular expressions print 就是grep命令的全称。

grep命令是我们常用的一个强大的文本搜索命令。也是一个文本过滤工具,用于查找文件里符合条件的字符串。
命令:grep [参数] [关键字] [文件名]
注意:
	可以通过 grep --help 查看grep的帮助信息
参数:
-c : 只输出匹配行的计数(常用)
-i : 不区分大小写
-h : 查询多文件时不显示文件名
-l : 查询多文件时只输出包含匹配字符的文件名
-n : 显示匹配行及行号(常用)
-s : 不显示不存在或无匹配文本的错误信息
-v : 显示不包含匹配文件的所有行(常用)
-w : 搜索整个词
-A NUM : 同时打印出之后的NUM行
-B NUM : 同时打印出之前的NUM行
-C NUM : 显示之前的NUM行,之后的NUM行
-o : 仅显示匹配到目标字符串(常用)
-E : 支持使用扩展的正则表达式字符串
-q : 静默模式,不输出任何信息

grep中常用正则表达式(略)

示例:
①[root@localhost ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
②[root@localhost ~]# ifconfig | grep inet
③[root@localhost ~]#  ifconfig | grep inet | grep -v inet6		//不包括inet6的内容
        inet 192.168.126.131  netmask 255.255.255.0  broadcast 192.168.126.255
        inet 127.0.0.1  netmask 255.0.0.0
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        
//|管道符:将前面命令字的结果作为后面命令字的执行环境。

二、sed命令

我们知道,vim采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但sed命令不同,它采用的是流编辑模式,最明显的特点是:在sed处理数据之前,需要预先提供一组规则,sed会按照此规则来编辑数据。

sed是文件编辑工具。因为它编辑文件是以”行“为单位的。

命令:sed [参数] '<匹配条件>/[动作]' [文件名]		(匹配条件与动作可以在不同位置;条件以/分隔)

参数:
参数为空:表示sed的操作效果,实际上不对文件进行编辑
-e<script>或--expression=<script>:以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件。
-i(常用):直接修改文件内容(表示对文件进行编辑)(危险操作)
-h或--help:显示帮助。
-n(常用)或--quiet或--silent:仅显示script处理后的结果(取消静默输出/默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。)。
-V或--version:显示版本信息。

匹配条件:
匹配条件分为两种:数字行号或者关键字匹配
关键字匹配格式:‘/关键字/’	(不区分单引号和双引号)
[root@localhost Desktop]# sed -i "2s/sed/SED/2" sed.txt		//sed.txt文件已存在(以下操作均是),且可对该文件进行直接修改。
数字匹配格式:
[root@localhost ~]# sed -n "1,4p" /etc/passwd	//查看1到4行的内容

动作详解:
a:在匹配到的内容下一行增加内容
i:在匹配到的内容当前行增加内容(目前的上一行)
g:替换所有
d:删除匹配到的内容(后面不带其他参数)
s:替换匹配到的内容
p:查看指定内容,通常p会与参数sed -n一起运行
e:多点编辑
c:取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行

注意:参数的-i与动作的i的区别。
示例:
[root@localhost Desktop]# cat sed.txt 
sed sed sed
sed sed sed
sed sed sed
sed sed sed
[root@localhost Desktop]# sed -i 's/sed/SED/' sed.txt//将第一列的小写sed全都替换成大写SED。(不写行默认为第一行)
[root@localhost Desktop]# cat sed.txt 			    //以”行“为单位的概念。
SED sed sed
SED sed sed
SED sed sed
SED sed sed
[root@localhost Desktop]# sed -i '4s/SED/sed/' sed.txt 	//将第四行第一列的大写SED替换成小写sed。	
[root@localhost Desktop]# cat sed.txt 
SED sed sed
SED sed sed
SED sed sed
sed sed sed
//比较bug一点:(行变换正常进行;变换列时必须按匹配条件的为列)
[root@localhost Desktop]# sed -i '2s/sed/SED/2' sed.txt  	//将第二行第三列的小写sed替换成大写SED。	
[root@localhost Desktop]# cat sed.txt 	//有小写sed出现的列叫做第一列,所以第二行第三列在当前文本下为第二行第二列
SED sed sed								//而第二行第一列的大写的SED匹配不上小写的sed,所以当列失效
SED sed SED
SED sed sed
sed sed sed

sed -i "s/sed/SED/g" sed.txt 		//将所有行所有列将小写sed替换成大写SED。
sed -i "2s/sed/SED/2" sed.txt 		//替换第二行第二列(列以匹配条件为列)前面一个2表示行,后一个2表示列。
[ root@Lin Desktop]# sed -i "2a\SED" sed.txt	//在第二行的下面添加一个SED。
[ root@Lin Desktop]# sed -i "2,4a\123" sed.txt	//在第二行到第四行的下面都增加一个123。
[ root@Lin Desktop]# sed -i "2,4i\asd" sed.txt	//在第二行到第四行的上面都增加一个asd。
[ root@Lin Desktop]# sed -i "2,9d" sed.txt 		//删除第二行到第九行(直接指令行删除,不用条件)。

三、awk命令

awk是一个功能非常强大的文档查看和编辑工具,它不仅能以行为单位还能以列为单位处理文件。

命令:awk [参数] '[动作]' [文件名]

常见参数:(参数的话使用单引号后缀双引号都行)
-F:指定输出列的分隔符,与内置变量OFS相同(回显结果的分隔符)
-f:调用脚本
-v:定义变量
	
常见动作:
print:显示内容
	$0:显示当前行所有内容
	$n:显示当前行的第n列内容
动作组成:(命令使用大括号;代码使用双斜杠)
	BEGIN{ 命令 }:初始代码块,主要和变量相关
	/pattern(if...)/{ 命令 }:匹配、执行代码块、字符串等
	END{ 命令 }:结束代码块,主要和信息输出相关
内置变量:
	FILENAME:当前输入文件的文件名,该变量是只读的
	NR:指定显示行的行号
	NF:输出当前行的列数
	OFS:输出格式的列分隔符,缺省是空格
	FS:输入文件的列分融符,缺省是连续的空格和Tab
	
注意:在参数当中的-F和内置变量当中的FS/OFS都是指定列的分隔符。
示例:
①以列为单位直接显示数据(以”列“为单位的概念。且awk也可以以行为单位)
[root@localhost ~]# awk '{print $1}' /proc/meminfo	 //打印指定列($1表示打印第一列),默认以空格为分隔符。
MemTotal:											//这里的动作必须以单引号包围,双引号识别不了。
...
[root@localhost Desktop]# awk '{print $1,$2}' /proc/meminfo //每行输出结果以空格分隔,且每行有两个整体。
MemTotal: 995672						 //打印第一列和第二列
...

②[root@localhost Desktop]# cat /proc/meminfo  //(在/proc/meminfo文件当中有一条名为Dirty的消息)
Dirty:                60 kB
...
[root@localhost Desktop]# awk '/Dirty/{print}' /proc/meminfo   	//匹配行,直接打印整行
//执行结果Dirty:                 0 kB  ----直接回显该条信息

③分隔符
(-F)
[root@localhost Desktop]# awk -F ":" '{print $0}' /proc/meminfo 	//打印指定列($0表示打印所有列)
MemTotal:         995672 kB				//每行输出结果以冒号分隔,且每行只有两个整体。
MemFree:           67500 kB				//假如以:分割的话,那么有空格(无论多少个空格/tab键也算)也当作一个整体。
...
[root@localhost ~]#  awk -F ":" '{print $1,$2}' /proc/meminfo
MemTotal         995672 kB				//打印第一列和第二列,输出结果以冒号分隔(冒号不显示出来)
MemFree           67600 kB
...
(OFS)
[root@localhost Desktop]# awk 'BEGIN{OFS=","}{print NR,$0}' /proc/meminfo //设置显示分隔符为“,”,并显示内容
1,MemTotal:         995672 kB	(逗号前后分别为一个整体)(注意引号的嵌套)
2,MemFree:           71236 kB
...

awd进阶实践:
④[root@localhost ~]# ll | awk '{if ($5>=1910) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}’	 //输出文件大小大于50B文件(以指定格式)
filename:2.txt
lenth:637
...
[root@localhost ~]# ll | awk '{if ($5>=1910 && /^-/) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}'

⑤[root@localhost Desktop]# cat awk.txt 
1 2 3 
4 5 6 
7 8 9 
awk -F ' ' '{for(i=1;i<=NF;i++) print $i}' awk.txt 		//顺序输出(一行一个数)
awk -F ' ' '{for(i=NF;i>=1;i--) print $i}' awk.txt		//每行逆序输出(一行一个数)