此文章为B站视频https://www.bilibili.com/video/BV1rA4y1S7Hk的个人记录版,方便以后自己回来复习,如果不对请多多见谅。
概述
三剑客有各自的领域:
grep:擅长查找功能
sed:擅长编辑
awk:擅长取列
1、正则表达式
正则表达式:Regual Expression ,由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表达控制或通配的功能。
正则表达式的意义:通过特殊字符的辅助,可以快速过滤、替换、处理所需的字符串、文本,让工作效率更加高效。
:正则表达式以行为单位进行工作,一次处理一行。
普通正则表达式:
符号 | 作用 |
^ | 用于模式的最左侧,匹配以设置字符开头的行。如"^我是小萌新",则是匹配以我是小萌新开头的行 |
$ | 用于模式的最右侧,匹配以设置字符结尾的行。如"$我是小萌新",则是匹配以我是小萌新结尾的行 |
^$ | 表示空行 |
. | 匹配除了空行外的任意有且只有一个字符 |
\ | 转义字符,屏蔽正则表达式中字符的特殊含义,如\.表示小数点 |
* | 匹配前一个字符(连续出现)0次或1次以上,重复0次为空,即匹配所有内容 |
.* | 匹配所有 |
^.* | 匹配以任意多个字符开头的行 |
.*$ | 匹配以任意多个字符结尾的行 |
[abcd]或[a-d] | 匹配集合内的任意一个字符,a或b或c或d |
[^abcd] | 匹配除了集合内的任意字符 |
\w(\w) | 匹配字母或数字或下划线或汉字(匹配不是字母、数字、下划线、汉字的字符) |
\s(\S) | 匹配空白符(匹配不是空白行的字符) |
\d(\D) | 匹配数字(匹配不是数字的字符) |
\b(\B) | 匹配单词的开始或结束(匹配不是单词开头或结尾的单词) |
扩展正则表达式:
对于grep而言扩展正则表达式必须用grep -E 才能生效;sed必须使用sed -r才能生效,
字符 | 作用 |
+ | 匹配一个字符1次或多次 |
[:/]+ | 匹配[]一内的:或/字符1次或多次 |
? | 匹配前一个字符0次或1次 |
| | 表示或者,同时过滤多个字符串 |
() | 分组过滤,被括起来的内容为一个整体 |
a(n,m) | 匹配a最少n次,最多m次 |
a(n,) | 匹配a最少n次 |
a(n) | 匹配a正好n次 |
a(,m) | 匹配a最多m次 |
2、grep
grep全拼:Global search Regular expression and Print out the line
作用,文本搜索工具,根据用户指定的条件对目标文本进行匹配检查并打印匹配的行。
语法:
grep [options ] [pattern] file
语法 参数 匹配模式 文本
参数 | 作用 |
-v | 排除匹配结果,即显示不被匹配到的行 |
-n | 显示匹配行与行号 |
-i | 忽略大小写 |
-c | 只统计匹配到的行数 |
-E | 使用egrep命令 |
--color=auto | 为匹配的字符串添加颜色 |
-w | 只匹配过滤的单词 |
-o | 只输出匹配的内容 |
-q | --quite,静默模式,即不输出任何内容 |
3、sed
注意:sed和awk使用单引号,双引号有特殊的解释。
sed是Stream Editor (字符流编辑器)的缩写,简称流编辑器。
sed是操作、过滤和转换文本内容的强大工具。
常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。
sed工作流程图:
sed语法及其常用参数:
语法:sed [选项] [sed内置命令符] [文件]
参数 | 解释 |
-n | 取消sed默认输出(默认输出:无论是不是匹配项都输出,即像cat一样把文本内容打印出来),常与sed内置命令p一起使用 |
-i | 直接将修改结果写入文件,不用-i,sed修改的是内存数据而不是修改源文件 |
-e | 多次编辑,不再需要管道符了 |
-r | 制成正则扩展 |
sed常用内置命令符:
sed内置命令符 | 解释 |
a | append,对文本进行追加,在指定行后添加一行或多行文本 |
d | delete,删除匹配行 |
i | insert,插入文本,在指定行后添加一行或多行文本 |
p | print,打印匹配行的内容,p与-n通常一起使用 |
s/正则/替换内容/g | 匹配正则内容,然后替换内容,结尾g表示全局匹配 |
sed匹配范围:
范围 | 解释 |
空地址 | 全文处理 |
单地址 | 指定文件某一行 |
/pattern/ | 被模式匹配到的每一行 |
范围区间 | 10,20表示10~20行;10,+5第10行向下5行;/pattern1/,/pattern2/ |
步长 | 1~2表示1,3,5,7奇数行,2~2表示2,4,6,8偶数行 |
sed案例演示:
演示文本:test.txt,里边是一些自己导入的信息
1、显示文本的第2,3行内容:
如果是:sed "2,3p" test.txt,发现系统打印整个文件的内容:(我这里有个173行的测试文件使用这条语句无法打印出内容,不知道机子内存太小还是sed输出有限制)
root@VM-12-13-debian:/# sed "2,3p" test.txt PID TTY TIME CMD 1376691 pts/1 00:00:00 bash 1376691 pts/1 00:00:00 bash 1396054 pts/1 00:00:00 ps 1396054 pts/1 00:00:00 ps
这是因为sed默认把内容打印出来,而想要只输出2,3行需要加参数-n取消sed默认输出:
root@VM-12-13-debian:/# sed "2,3p" test.txt -n 1376691 pts/1 00:00:00 bash 1396054 pts/1 00:00:00 ps
2、打印文本的2~5行
第一种方法:sed "2,5p" test,txt -n root@VM-12-13-debian:/tmp# sed "2,6p" test.txt -n 1067176 pts/0 00:00:00 bash 1083172 pts/0 00:00:00 ps Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:sshdd 0.0.0.0:* LISTEN 第二种方法:sed "2,+3p" test.txt -n root@VM-12-13-debian:/tmp# sed "2,+3p" test.txt -n 1067176 pts/0 00:00:00 bash 1083172 pts/0 00:00:00 ps Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State
3、打印含有State的行:(和grep “State” test.txt 结果一致)
root@VM-12-13-debian:/tmp# sed -n "/State/p" test.txt Proto Recv-Q Send-Q Local Address Foreign Address State Proto RefCnt Flags Type State I-Node Path
4、删除含有State的行:
sed "/State/d" test.txt -n
但是再在test.txt文本组查找State字符串发现依旧存在:
root@VM-12-13-debian:/tmp# sed -n "/State/p" test.txt Proto Recv-Q Send-Q Local Address Foreign Address State Proto RefCnt Flags Type State I-Node Path
这是因为sed会把文本内容一行一行读取到内存中进行操作,修改的是内存中的数据,如果需要对源文件进行修改需要加-i(-i.bak表示备份源文件并对源文件进行修改)参数:
再查询时States所在的行已经被删除:
5、删除8(指定行)到结尾的行:
root@VM-12-13-debian:/tmp# sed '8,$d' test.txt PID TTY TIME CMD 1067176 pts/0 00:00:00 bash 1083172 pts/0 00:00:00 ps Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:sshdd 0.0.0.0:* LISTEN tcp 0 0 localhost:postgresql 0.0.0.0:* LISTEN
6、将文件中的LISTEN替换为CLOSE:
语法:sed 's/旧内容/新内容/g' filename -i //s,g为sed内置符,s为search查找,g为global全局
sed 's/LISTEN/CLOSE/g' test.txt -i
7、将文件中的CLOSE替换为LISTEN以及tcp替换为usp:
sed -e "s/CLOSE/LISTEN/g" -e "s/tcp/udp/g" test.txt
8、在文件中的第二行之后追加一行数据
sed '2a wo shi yi zhi xiao meng xin' test.txt
9、在第2行之前添加一行数据:
10、在第4行后追加多行数据(利用\n)
11、在每一行的后边加一行数据(不指定范围则默认为全文):
4、awk
awk具有强大的文本格式化能力,好比将一些数据故事化为专业的excel表的样式。
awk更是一门编程语言,支持判断、循环、数组等功能。
awk基础
awk语法:awk [option] 'pattern{action}' file
awk 参数 模式{动作} file
awk擅长文本格式化且输出格式化后的结果,一次最常用的动作是print和printf。
awk内置变量含义:
变量 | 解释 |
$0 | 表示一整行信息 |
$1 | 表示一行中的表示第一列 |
$2 | 表示一行中的第二列 |
$n | 表示一行中的第n列 |
$NF | 表示一行中的最后一列,倒数第二列可以表示为$(NF-1) |
FS | 字段分隔符,默认是空格 |
NF(Number of fields) | 分割后,当前行有一共多少个字段 |
NR(Number of records) | 当前记录数,行数 |
OFS | 输出字段分割符,默认为空白字符 |
FS | 输入字段分割符,默认为空白字符 |
ORS | 输出换行符,输出时用指定符号代替换行符 |
RS | 输入换行符,指定输入时的换行符 |
awk man | 更多变量及其详细信息查看手册 |
FNR | 各文件分别计数的行号 |
FILENAME | 当前文件名 |
ARGD | 命令行参数的个数 |
ARGV | 数组,保存着命令行给定的各参数 |
awk参数:
参数 | 解释 |
-F | 指定分割符 |
-v | 定义或修改一个awk内部的变量 |
-f | 从脚本文件中读取awk命令 |
实例:
1、打印文中数据的第一列:
awk '{print $1}' test.txt
//awk '{print $0}' test.txt==awk '{print}' test.txt-->$0表示一整行的信息,语句相当于打印全文数据,即cat test.txt
2、打印2,3,5列
如果使用:
awk '{print $2$3$5}' test.txt |head或是awk '{print $2 $3 $5}' test.txt |head
发现输出的数据没有分隔符,可观看性极差:
此时可以在列数之间加逗号,系统会将打印的数据以空格为分隔符:
awk '{print $2,$3,$5}' test.txt |head
3、自定义输出内容
此时必须外层单引号,内层双引号;但是内置变量$2,$3不能添加双引号,否则会被认为是单纯的字符:
awk '{print "第一列数据"$2,"第二列数据"$3}' test.txt |head -n 6
4、显示文件指定行
NR在awk中表示行号,NR==5表示行号是5的那一行,NF为一行中的列数,$NF为最后一列
需要注意:一个等号(=)为赋值,两个等号才是关系运算符(==)
awk 'NR==5' test.txt
awk 'NR==2','NR==5' test.txt 或awk 'NR==2,NR==5' test.txt//输出2~5行
5、打印行号
6、输入分割符及输出分割符的修改
awk有两个分割符,一为输入分割符(变量为PF,也可以使用-F指定),二为输出分割符(变量为OFS)
awk在处理文本时,以输入分隔符为准,把文本切成多个片段,默认符号时空格。同时我们也可以使用-F指定分割符。
awk -F ":" '{print $1}' test.txt |head -n 5 //也可以为 awk -v PF=":" ":" '{print $1}' test.txt |head -n 5
以"----------"进行输出分割:
awk -F ":" -v OFS="------" '{print $1,$2}' test.txt |head -n 5
7、未完待续
标签:00,grep,sed,awk,test,匹配,txt,三剑客 From: https://www.cnblogs.com/xiaoliyulixianji/p/16950121.html