linux文本三剑客---grep,sed,awk

目录

grep

什么是grep?

grep实例演示

命令参数:

案例演示:

sed

概念:

常用选项:

案例演示:

awk

概念:

awk常用命令选项:

awk变量:

内置变量

自定义变量

awk的简单案例

[在"a b c d"的d后面插入三个字符](#在“a b c d”的d后面插入三个字符)

统计tcp连接状态数量

统计日志中状态码非200的IP的次数


grep

什么是grep?

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

egrep = grep -E:扩展的正则表达式 (除了**< , > , \b** 使用其他正则都可以去掉\)

grep实例演示

命令参数:

  • -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。

  • -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。

  • -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。

  • -c:统计匹配的行数

  • -e :实现多个选项间的逻辑or 关系

  • -E:扩展的正则表达式

  • -f FILE:从FILE获取PATTERN匹配

  • -F :相当于fgrep

  • -i --ignore-case #忽略字符大小写的差别。

  • -n:显示匹配的行号

  • -o:仅显示匹配到的字符串

  • -q: 静默模式,不输出任何信息

  • -s:不显示错误信息。

  • -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配

  • -w :匹配 整个单词

案例演示:

sed

概念:

sed 是一种流编辑器,它一次处理一 内容。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间 "(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如'D' 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间 。这样不断重复,直到文件末尾。文件内容并没有改变 ,除非你使用重定向存储输出或-i

功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作

常用选项:

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行

  • **-e:**多点编辑,对每行处理时,可以有多个Script

  • -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写

  • -r :支持扩展的正则表达式

  • -i:直接将处理的结果写入文件

  • -i.bak:在将处理的结果写入文件之前备份一份

案例演示:

[root@along ~]# cat demo

aaa

bbbb

AABBCCDD

[root@along ~]# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印

aaa

aaa

bbbb

AABBCCDD

[root@along ~]# sed -n "/aaa/p" demo #-n不显示没匹配的行

aaa

[root@along ~]# sed -e "s/a/A/" -e "s/b/B/" demo #-e多点编辑

Aaa

Bbbb

AABBCCDD

[root@along ~]# cat sedscript.txt

s/A/a/g

[root@along ~]# sed -f sedscript.txt demo #-f使用文件处理

aaa

bbbb

aaBBCCDD

[root@along ~]# sed -i.bak "s/a/A/g" demo #-i直接对文件进行处理

[root@along ~]# cat demo

AAA

bbbb

AABBCCDD

[root@along ~]# cat demo.bak

aaa

bbbb

AABBCCDD

awk

概念:

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数 和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

awk常用命令选项:

  • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:

  • -v var=value:赋值一个用户定义变量,将外部变量传递给awk

  • -f scripfile:从脚本文件中读取awk命令

awk变量:

变量:内置和自定义变量,每个变量前加 -v 命令选项

内置变量

格式:

  • FS输入字段分隔符默认为空白字符

  • OFS输出字段分隔符,默认为空白字符

  • RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效

  • ORS :输出记录分隔符,输出时用指定符号代替换行符

  • NF :字段数量,共有 多少字段, NF引用最后一列,(NF-1)引用倒数第2列

  • NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始

  • FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始

  • FILENAME :当前文件名

  • ARGC :命令行参数的个数

  • ARGV :数组,保存的是命令行所给定的各参数,查看参数

演示:

[root@along ~]# cat awkdemo

hello:world

linux:redhat:lalala:hahaha

along:love:youou

[root@along ~]# awk -v FS=':' '{print $1,$2}' awkdemo #FS指定输入分隔符

hello world

linux redhat

along love

[root@along ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo #OFS指定输出分隔符

hello---world

linux---redhat

along---love

[root@along ~]# awk -v RS=':' '{print $1,$2}' awkdemo

hello

world linux

redhat

lalala

hahaha along

love

you

[root@along ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo

hello world---linux redhat---along love---

[root@along ~]# awk -F: '{print NF}' awkdemo

2

4

3

[root@along ~]# awk -F: '{print $(NF-1)}' awkdemo #显示倒数第2列

hello

lalala

love

[root@along ~]# awk '{print NR}' awkdemo awkdemo1

1

2

3

4

5

[root@along ~]# awk END'{print NR}' awkdemo awkdemo1

5

[root@along ~]# awk '{print FNR}' awkdemo awkdemo1

1

2

3

1

2

[root@along ~]# awk '{print FILENAME}' awkdemo

awkdemo

awkdemo

awkdemo

[root@along ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo1

3

[root@along ~]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1

awk

[root@along ~]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1

awkdemo

[root@along ~]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1

awkdemo1

自定义变量

-v var=value

[root@along ~]# awk -v name="along" -F: '{print name":"$0}' awkdemo

along:hello:world

along:linux:redhat:lalala:hahaha

along:along:love:you

awk的简单案例

在"a b c d"的d后面插入三个字符

统计tcp连接状态数量

统计日志中状态码非200的IP的次数

相关推荐
长弓聊编程8 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.15 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒38 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热42 分钟前
路由基础(全)
linux·网络·网络协议·安全
传而习乎1 小时前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
soulteary1 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
IT果果日记1 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教1 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes