Linux-正则三剑客(3)

简介: Linux-正则三剑客(1)

6.写入对应行

sed "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" passwd.txt.bak -i

每行都加个分隔符

sed "a ----------------------------------------------------" passwd.txt.bak -i

7.实例

拿出ip和子网掩码和广播地址

ifconfig ens33 | sed "2p" -n | sed "s/^.*inet//"


五、awk

awk更像一门编程语言,支持条件判断、数组、循环等功能

三剑客的各个特点

  • grep,擅长单纯的查找或匹配文本内容
  • awk,更适合编辑、处理匹配到的文本内容
  • sed,更适合格式化文本内容,对文本进行复杂处理

三个命令称之为Linux的三剑客

1.awk基础

awk语法:

awk [option] 'pattern[action]' file...

awk 参数 '条件动作' 文件

2.举例

空格作为分隔符

$0 代表一整行

$1 代表第一列

$2 代表第二列

...

awk '{print $1}' 1.txt

3.NF和NR

awk '{print $NF}' 1.txt 
awk '{print $NR}' 1.txt

NR显示文件第五行

awk 'NR==5' 1.txt

NR显示文件第二行到第五行

root@ou-virtual-machine:~# awk 'NR==2,NR==5' 1.txt 
a6 a7 a8 a9 a10
a11 a12 a13 a14 a15
a16 a17 a18 a19 a20
a21 a22 a23 a24 a25

4.字符串占位

输出默认不带分隔符

root@ou-virtual-machine:~# awk '{print $1 $2 $3}' 1.txt 
a1a2a3
a6a7a8
a11a12a13
a16a17a18
a21a22a23
root@ou-virtual-machine:~# awk '{print $1__$2__$3}' 1.txt 
a1a2a3
a6a7a8
a11a12a13
a16a17a18
a21a22a23

逗号会默认加空格分隔符

root@ou-virtual-machine:~# awk '{print $1,$2,$3}' 1.txt 
a1 a2 a3
a6 a7 a8
a11 a12 a13
a16 a17 a18
a21 a22 a23

"字符串"分隔符

root@ou-virtual-machine:~# awk '{print "1 List: "$1,"2 List: "$2,"3 List: "$3}' 1.txt 
1 List: a1 2 List: a2 3 List: a3
1 List: a6 2 List: a7 3 List: a8
1 List: a11 2 List: a12 3 List: a13
1 List: a16 2 List: a17 3 List: a18
1 List: a21 2 List: a22 3 List: a23
1 List:  2 List:  3 List:

5.awk参数

前面的文件分隔符是空格,awk自动识别空格作为分隔符

但是如果我们用其他的分割符,那么awk并不会自动识别

root@ou-virtual-machine:~# cat 1.txt
a1 a2 a3 a4 a5
a6 a7 a8 a9 a10
a11 a12 a13 a14 a15
a16 a17 a18 a19 a20
a21 a22 a23 a24 a25
root@ou-virtual-machine:~# cat 1.txt.bak 
a1#a2#a3#a4#a5
a6#a7#a8#a9#a10
a11#a12#a13#a14#a15
a16#a17#a18#a19#a20
a21#a22#a23#a24#a25
root@ou-virtual-machine:~# awk "{print $1}" 1.txt.bak 
a1#a2#a3#a4#a5
a6#a7#a8#a9#a10
a11#a12#a13#a14#a15
a16#a17#a18#a19#a20
a21#a22#a23#a24#a25

通过-F来修改识别分隔符

cat 1.txt.bak | awk -F"#" '{print $1}'

小写f

root@ou-virtual-machine:~# echo '"{print}"' > 1
root@ou-virtual-machine:~# awk -f 1 1.txt 
a1 a2 a3 a4 a5
a6 a7 a8 a9 a10
a11 a12 a13 a14 a15
a16 a17 a18 a19 a20
a21 a22 a23 a24 a25

6.awk变量

取出本机的ip

第一步先取出ifconfig第二行的数据

ifconfig | awk 'NR==2{print $0}'

ifconfig | awk 'NR==2{print $0}' | awk '{print $2}'

7.awk的分隔符

  • 输入分隔符,awk默认是空格,空白字符,变量名是FS
  • 输出分隔符,OFS

FS输入分隔符

awk逐行处理文本的时候,以输入分隔符为准,把文本切成多个片段,默认符号是空格

当我们处理特殊文件,没用空格的时候,可以自由指定分隔符

awk -F '#' '{print $1}' 1.txt.bak

修改默认输出符

root@ou-virtual-machine:~# awk -F '#'  '{print $1,$2,$4}' 1.txt.bak 
a1 a2 a4
a6 a7 a9
a11 a12 a14
a16 a17 a19
a21 a22 a24  
root@ou-virtual-machine:~# awk -F '#' -v OFS=': ' '{print $1,$2,$4}' 1.txt.bak 
a1: a2: a4
a6: a7: a9
a11: a12: a14
a16: a17: a19
a21: a22: a24
: : 
root@ou-virtual-machine:~#

8.awk的变量

NR、NF和FNR变量

[root@localhost ~]# awk -F "#" '{print NR,NF,$1,$2}' 1
1 5 a1 a2
2 5 a6 a7
3 5 a11 a12
4 5 a16 a17
5 5 a21 a22

NR和FNR的区别

[root@localhost ~]# awk -F "#" '{print FNR,$1,$2}' 1 1
1 a1 a2
2 a6 a7
3 a11 a12
4 a16 a17
5 a21 a22
1 a1 a2
2 a6 a7
3 a11 a12
4 a16 a17
5 a21 a22
[root@localhost ~]# awk -F "#" '{print NR,$1,$2}' 1 1
1 a1 a2
2 a6 a7
3 a11 a12
4 a16 a17
5 a21 a22
6 a1 a2
7 a6 a7
8 a11 a12
9 a16 a17
10 a21 a22

ORS和RS

[root@localhost ~]# awk -F "#" '{print RS="-------",$1,$2}' 1 
------- a1 a2
------- a6 a7
[root@localhost ~]# awk -F "#" '{print ORS="-------",$1,$2}' 1 
------- a1 a2-------------- a6 a7-------------- a11 a12-------------- a16 a17-------------- a21 a22-------[
[root@localhost ~]#

FILENAME

数组

默认数组

[root@localhost ~]# awk "{print ARGV[0],$0}" 1
awk 0
awk 0
awk 0
awk 0
awk 0
[root@localhost ~]# awk "{print ARGV[1]}" 1
1
1
1
1
1
[root@localhost ~]# awk "{print ARGV[2]}" 1
[root@localhost ~]# awk '{print ARGV[0],ARGV[1],ARGV[2]}' 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
awk 1 1
[root@localhost ~]#

自定义变量

[root@localhost ~]# awk -v myname='o' 'BEGIN{print "myname=",myname}'
myname= o
[root@localhost ~]#

9.awk格式化输出

print和printf的区别

printf需要自定义格式

awk '{printf $0}' 1
a1#a2#a3#a4#a5a6#a7#a8#a9#a10a11#a12#a13#a14#a15a16#a17#a18#a19#a20a21#a22#a23#a24#a25[root@localhost ~]# 
[root@localhost ~]#

自定义格式

[root@localhost ~]# printf "%s\n" a b c d e
a
b
c
d
e
[root@localhost ~]# awk 'BEGIN{printf "%s\n%s\n",1,2,3,4,5}'
1
2

区别

相关文章
|
运维 Linux Perl
Linux-正则三剑客(1)
Linux-正则三剑客
131 0
|
Perl
Linux-正则三剑客(2)
Linux-正则三剑客(1)
121 0
|
Web App开发 网络协议 Unix
Linux-文本处理三剑客awk详解+企业真实案例(变量、正则、条件判断、循环、数组、分析日志)
文本处理 awk 1.awk简介 awk是一种编程语言,用于在Linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其他命令的输出,它支持用户自定义函数和动态正则正则表达式等先进功能,是Linux/unix下的一个强大的编程工具。它在命令行中使用,但更多是作为脚本来使用。
695 0
Linux-文本处理三剑客awk详解+企业真实案例(变量、正则、条件判断、循环、数组、分析日志)
|
1月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
285 1
二、Linux文本处理与文件操作核心命令
|
1月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
549 56
|
15天前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
143 2
|
25天前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
77 0
Linux内存问题排查命令详解
|
1月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
138 16