Linux文本处理三剑客(grep,sed,awk)

article/2025/10/2 9:21:33

文章目录

  • 快捷键
  • Shell通配符
    • *通配符
    • ? 通配符
    • [] 通配符
  • 正则表达式
  • grep(文本过滤)
  • sed(文本编辑)
    • 替换文本内容(sed -i "s/原内容/替换内容/g" file.filetype)
  • awk(文本统计)
    • awk文本操作( awk [选项] '{脚本命令}' 文件名)
    • 注意(万物皆字符串,一劳永逸)
    • awk使用的查漏补缺
    • awk的数组下标可为拼接字符串(类Map)
    • 插入新字段和格式化空白
    • 从ifconfig中筛选IPV4字段(读取某行中某字段)
    • 读取配置文件中“某段”(读取某段)
    • 根据字段进行‘行’去重
    • awk数组做次数统计(数组索引去重统计)
    • awk数组排序(sort或PROCINFO)
    • 统计各key下独立value:IP个数(键去重并统计值个数)(多字段排重)
    • 处理字段中包含了字段分割符(逗号)的数据
    • 截取字段中指定区间的字符(substr($n,start,length))
    • 替换某字段为其他字段(gsub(/待替换原内容/,"替换内容"))
  • BUG之旅
      • 涉及通配符统计数据时,重复统计问题(表现:统计量>正常量)

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

先了解数据格式,再编写脚本处理数据。

快捷键

  • Ctrl+C 中断了进程,返回到终端界面。
  • Ctrl+Z 暂停了进程,返回到终端界面
  • ctrl+a 移动到命令行首
  • ctrl+e 移动到命令行尾
  • ctrl+u 清空光标前的内容
  • ctrl+k 清空光标后的内容
  • ctrl+l 清空屏幕终端内容,同clear

tab补齐,双击tab列出候选项。

Shell通配符

Shell通配符

*通配符

*通配符匹配任意一个或多个字符

? 通配符

"?"通配符匹配一个任意字符(相比*存在数量限制)

[] 通配符

[list] 匹配list中任意单个字符

正则表达式

正则表达式是以行为单位,一次处理一行。
linux中正则表达式仅受三剑客(sed,awk,grep)支持,其他命令无法使用(仅能使用通配符*)。

操作内容用正则,操作文件名用通配符

正则表达式分类
基本正则表达式

^$.[]*

  • ^word: 搜索以word开头的。
  • word$ 搜索以word结尾的。
  • . 点 表示任意一个字符
  • \ 保持原样输出
    在这里插入图片描述

扩展正则表达式
扩展正则必须用grep -E才能生效
grep不加参数,得在特殊字符前面加""反斜杠,识别为正则。

(){}?+|等字符

在这里插入图片描述

grep(文本过滤)

注意:grep是模糊过滤(包含则通过),实际上若要准确识别还要搭配awk的‘{if判断是否相等语句}‘进行精准过滤。
(查询文本)grep xxx:从stdin中读入若干行数据,如果某行中包含xxx,则输出该行(逐行输出);否则忽略该行。
可以配合ps,ls等stdout命令食用:查询进程/目录中是否存在对应进程和文件

grep配合sort可以有序输出(默认按照第一列的ASCII 码次序排序)
grep xxx | sort

grep详解
Linux命令 zgrep
使用zgrep命令可以在压缩文件中调用grep按正则表达式来搜索
zgrep -hw

grep xxx ./*.filetype:将path下的全部filetype文件内容进行查询匹配逐行输出=》文件名:匹配列
在这里插入图片描述

在这里插入图片描述

sed(文本编辑)

Linux中sed详解

替换文本内容(sed -i “s/原内容/替换内容/g” file.filetype)

常见用法:
首先写一个tmpl模板文件然后写一个脚本基于tmpl模板文件替换占位符传参。

sh 脚本.sh 变量参数参数sed -i /\${tmpl参数占位符} /${变量参数} tmpl复制份

在这里插入图片描述
在这里插入图片描述
替换特殊字符(利用反斜杠)
反斜杠用法
在这里插入图片描述

awk(文本统计)

awk中支持C语法, 可以有分支条件判断, 循环语句等, 相当与一个小型编程语言.

  • 脚本命令必须用’'括起来,当匹配规则为字符串和正则表达式的时候需要使用”/…/“符号括起来;而执行命令需要使用{}括起来。

  • 对awk而言,正则表达式是置于两个正斜杠之间、由字符组成的模式。
    正则表达式是以/作为开始和结束的标记,表达式语法在两个/中间包裹。

  • $n~/…/表示某字段匹配该正则表达式:返回true/false

  • awk默认是按行读取并处理文本,最终按行输出。

  • awk实现统计功能都是借助awk数组索引下标可为字符串功能进行标识定位

awk文本操作( awk [选项] ‘{脚本命令}’ 文件名)

Linux awk命令详解
linux之awk超详解
linux awk数组操作详细介绍

cat获得文件内容,grep逐行分析提取文件内容并输出,awk解析操作需求内容的每一行。
cat | grep | awk

awk将"作为文本分隔符,然后提取第四列作为sum数组的定位下标并将其对应的数组元素值加一,处理完全部内容后,END最后用for循环逐行输出数组值(一次输出占一行)。

单双引号可以相互包容并原样显示。
注意:实际应用时单包双/双包单,不可单包单,双包双,无意义。

无序:cat XXX.filetype | grep "yyy" | awk -F'"' '{sum[$4]+=1} END {for(k in sum) print k ":" sum[k]}'
有序:(已知:k<=100):cat XXX.filetype | grep "yyy" | awk -F'"' '{sum[$4]+=1} END {for(k=1;k<=100;k++) if (sum[k]>0) print k ":" sum[k]}'
  • -F“”单或双引号中指定分隔符,默认为空格,当分隔符为特殊符号时需要用转义字符。
  • awk 中的数组不必提前声明,也不必声明大小。数组元素用 0 或空串来初始化。
  • $n 指定分隔的第n个字段,如$1、$3分别表示第1、第3列.$0代表输入整行内容。
  • 若awk的{}中要用定义的变量则’{“$变量“}‘或’{“‘$变量’“}’
  • BEGIN{脚本命令}:输入开始前执行操作,END{脚本命令}:输入结束后执行操作,其余的{脚本命令}为处理每行数据的操作。
  • BEGIN和END必须为大写。
  • 一个{}代表一个代码块(作用范围),在{}中实现功能。
  • ‘true/false{代码块}’:是/否运行代码块。代码块前可加if判断或者去掉if()只留下判断语句决定是否运行代码块。
  • for{}限制for循环的作用范围,print{}限制print输出范围。
  • awk中NF,NR的含义
    awk中NF和NR的意义,其实你已经知道NF和NR的意义了,NF代表的是一个文本文件中一行(一条记录)中的字段个数,NR代表的是这个文本文件的行数(记录数)。在编程时特别是在数据处理时经常用到。建议你看看有关awk编程方面的资料,这可是一个功能非常强大的工具。
    for(i=1;i<=NF;i++)
    在这里插入图片描述
awk -F, '{SUM['$number']=SUM['$number']+1}  END {for (i in SUM) print i,SUM[i]} '
  • for…in 输出,因为数组是关联数组,默认是无序的。所以通过for…in 得到是无序的数组。如果需要得到有序数组,需要通过下标获得(注意:数组下标是从1开始,与c数组不一样)。
    无序:for(k in arry),有序:for(k=1;k<=len;k++)
    print k : arry[k]

注意(万物皆字符串,一劳永逸)

awk当中的数组是关联数组,它的索引全是字符串,即便指定为数值也会转化为字符串:arr[1]==arr[“1”]

若数组内使用自定义变量则AWK的数组索引下标直接用"‘’"来声明字符串变量,防止变量为字符串非数值作为下标导致出错。
未使用双引号则默认为数值,反之可为字符串类型(双引号需要在变量最外侧标明)。

'{SUM["'$number'"]=SUM["'$number'"]+$4}'

若报错则说明检索的文本没有对应属性导致SUM[]中下标为空。
在这里插入图片描述

awk使用的查漏补缺

awk的数组下标可为拼接字符串(类Map)

echo "123,456,789" | awk -F, '{sum[$1"~"$2"~"$3]++}END{for(i in sum)print i,sum[i]}'

在这里插入图片描述

插入新字段和格式化空白

awk 命令默认分隔符为空格或制表符。
插入拼接新字段(直接拼接)
在这里插入图片描述

echo "a b c" | awk '{$2=$2" 666" ; print}'

在这里插入图片描述
格式化空白(牵一发动全身)
默认格式化后仅字段之间仅保留一个空格。
移除每行的前缀,后缀空白,并将各部分左对齐。

echo "a                          b c" | awk '{$2=$2 ; print}'

在这里插入图片描述
可以设置字段间保留一个制表符。
在这里插入图片描述

从ifconfig中筛选IPV4字段(读取某行中某字段)

正则表达式是以/作为开始和结束的标记,表达式语法在两个/中间包裹
对awk而言,正则表达式是置于两个正斜杠之间、由字符组成的模式。

awk:取包含inet的行并且!($2匹配/^127/)的$2.

‘true/false{代码块}’:是/否运行代码块。代码块前可加if判断或者去掉if()只留下判断语句决定是否运行代码块。

注意:awk '/xxxyyy/{print}'等效于grep xxxyyy
ifconfig | awk '/inet / && !($2~/^127/){print $2}'

在这里插入图片描述
awk按段读取

ifconfig | awk 'BEGIN{RS=""}!/^lo/{print$6}'
等价
ifconfig | awk 'BEGIN{RS=""}NR==1{print$6}'

在这里插入图片描述

在这里插入图片描述

读取配置文件中“某段”(读取某段)

此处也可以在命令行执行。

index($0,"[xxx]"){printwhile( (getline var) > 0 ){if(var ~ /\[.*\]/){exit}print var}}

在这里插入图片描述
在这里插入图片描述

根据字段进行‘行’去重

注意:print==print$0
所有文本操作命令都要在‘{代码块}’中使用

‘true/false{代码块}’:是/否运行代码块。代码块前可加if判断或者去掉if()只留下判断语句决定是否运行代码块。

[xxx]
6?6?6?6?6?6
8?8?8?8?8?8?8?8
9?9?9?9?9?9?9?9?9
[yyy]
9?9?9?9?9?9?9?9?9
8?8?8?8?8?8?8?8
6?6?6?6?6?6
awk -F "?" '!arr[$2]++{print}' test666.txt
awk -F "?" '{arr[$2]++;if(arr[$2]==1)print}' test666.txt

在这里插入图片描述

awk数组做次数统计(数组索引去重统计)

awk '{a[$0]++} END{for(i in a) print i,a[i]}' test666.txt

在这里插入图片描述

awk数组排序(sort或PROCINFO)

sort命令
Linux sort命令用于将文本文件内容加以排序。sort可针对文本文件的内容,以行为单位来排序。shell中sort命令有3种执行模式,分别是排序文本,检查文件是否已经排序,合并文件。

数组索引无序输出变为按照数组索引降序输出。
PROCINFO[“sorted_in”]=“@val_num_desc”;

awk '{a[$1]++}END{PROCINFO["sorted_in"]="@val_num_desc";for(i in a)print i,a[i]}' test666.txt
只输出前十个
awk '{a[$1]++}END{PROCINFO["sorted_in"]="@val_num_desc";for(i in a){if(cnt++==10){exit}print i,a[i]}}' test666.txt

在这里插入图片描述

统计各key下独立value:IP个数(键去重并统计值个数)(多字段排重)

key:value
统计相同key下不同value的个数。
点睛之笔:awk数组索引下标排重法(awk自带以逗号为间隔的索引下标表示法)
awk当中的数组是关联数组,它的索引全是字符串,即便指定为数值也会转化为字符串:arr[1]==arr[“1”]

awk -F"|" '!arr[$1,$2]++{cnt[$1]++}END{for(i in cnt)print i,cnt[i]}' test888.txt

在这里插入图片描述

处理字段中包含了字段分割符(逗号)的数据

BEGIN{FPAT=“[^,]+|\”.*\“”}

awk 'BEGIN{FPAT="[^,]+|\".*\""} {print $1}'

截取字段中指定区间的字符(substr($n,start,length))

start为$n字段的起始索引(从一开始),length为读取长度。

  • substr($n,start,length)//start开始读取length个字符。
  • substr($n,start)//start开始读取到最后。
awk -F"," '{print substr($2,1,3)}' test999.txt

在这里插入图片描述

替换某字段为其他字段(gsub(/待替换原内容/,“替换内容”))

在awk语句中,可以使用sub或者gsub进行文本替换,其中sub只是对第一处匹配进行替换,而gsub能够对所有匹配进行替换。
实例演示
源数据格式

1:2:3:4
a: b:c:d

#将每行第一个:替换成-

printf '1:2:3:4\na:b:c:d\n' | awk '{sub(/:/,"-")}1'

1-2:3:4
a-b:c:d

#将每行的:替换成-

printf '1:2:3:4\na:b:c:d\n' | awk '{gsub(/:/,"-")}1'

1-2-3-4
a-b-c-d

实例:去掉空格

awk '{gsub(/ /,"")}1'

注意,这行代码末尾有个‘1’,这个数的作用是表示打印,换成其他非零数字都可以,等同于

awk '{gsub(/ /,"");print $0}'

在这里插入图片描述

BUG之旅

涉及通配符统计数据时,重复统计问题(表现:统计量>正常量)

当涉及*通配符的统计数据出问题时,一般是通配符导致的重复统计问题,需要精确调整下通配符。


http://chatgpt.dhexx.cn/article/WOnuWQ5Y.shtml

相关文章

Linux命令教程第三期

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言awk补充说明语法形式模式示例其他语句数组的定义 col补充说明语法选项 comm补充说明语法选项参数 csplit补充说明语法选项参数实例 ed补充说明语法选项参数 egr…

Linux 私房菜 笔记(完结)

目录 第0章 计算机概论 基本知识 操作系统&#xff1a; 内核功能&#xff1a; 应用程序&#xff1a; 第一章 什么是LINUX 第0章 计算机概论 基本知识 电脑主要由五大单元组成&#xff1a; 输入单元&#xff0c;输出单元&#xff0c;cpu内部的控制单元&#xff0c;算数逻辑…

【Linux】内存管理机制

Linux内存管理机制 内存的表象层次依次为 逻辑地址------>线性地址----->物理地址 逻辑地址经过段机制转换成线性地址。 线性地址经过页机制转换成物理地址。 Linux将所有程序的段地址定为 0 - 4G&#xff08;Linux中&#xff09;&#xff0c;所有虽然逻辑地址和线性…

Linux操作系统基础知识

〇、操作系统基础 1、什么是操作系统 操作系统(Operating System, OS)&#xff0c;介于硬件资源和应⽤程序之间的⼀个系统软件。 2、操作系统的功能 操作系统位于硬件资源之上&#xff0c;管理硬件资源&#xff1b;应⽤程序之下&#xff0c;为应⽤程序提供服务&#xff0c;同…

Python描述 LeetCode 23. 合并K个升序链表

Python描述 LeetCode 23. 合并K个升序链表 大家好&#xff0c;我是亓官劼&#xff08;q guān ji &#xff09;&#xff0c;在【亓官劼】公众号、CSDN、GitHub、B站等平台分享一些技术博文&#xff0c;主要包括前端开发、python后端开发、小程序开发、数据结构与算法、docker、…

进程间通信【Linux】

文章目录 1. 进程间通信1.1 什么是进程间通信1.2 进程间通信的必要性1.3 进程间通信的本质1.4 进程间通信的方式 2. 匿名管道2.1 匿名管道的概念2.2 匿名管道的原理注意 2.3 实现匿名管道pipe函数步骤1. 创建管道2. 创建子进程3. 构建单向信道子进程父进程构建一个变化的字符串…

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day33】—— 手撸算法2

大家好&#xff0c;我是陈哈哈&#xff0c;北漂五年。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深Java选手&#xff0c;深知面试重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于Java岗面试中的高频面试题&#xff0c;以每日3题的形式&…

合并k个已排序的链表

ojbk...开始以为这题没有内存要求,所以就用来一个很简单的方法合并。创建第三条链表&#xff0c;结果部分案例过不去。 这个代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x)…

LeetCode 88. 合并两个有序数组 C/C++/Python

欢迎加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 88. 合并两个有序数组 C语言版C版Python版 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个…

C语言——如何较为高效的方法合并两个有序数组,使之成为一个有序数组

题目&#xff1a;有两个有序数组arr1[]和arr2[]&#xff0c;将它们合并成数组arr[]&#xff0c;要求arr[]也是有序数组。 思路&#xff1a;新定义一个数组arr&#xff0c;最大长度为100&#xff0c;从两数组最左边开始比起&#xff0c;把小的放入新集合&#xff0c;然后相应的i…

Linux(Centos6、Centos7)常用关机命令(halt命令需针对不同版本)

1、Centos6关机命令 CentOS6立即关机一共有三种形式&#xff1a; ① shutdown命令&#xff1a; [rootlocalhost ~]# shutdown -h 0② init命令&#xff1a; [rootlocalhost ~]# init 0③ halt命令&#xff08;与Centos7不同&#xff09;&#xff1a; [rootlocalhost ~]# h…

centos----关机重启命令

1.shutdown 参数 时间 shutdown -h now/具体时间&#xff0c;关机 shutdown -r now/具体时间&#xff0c;重启 shutdown -c 取消上次关机或者重启命令 2.其他关机重启命令 关机:halt/poweroff/init 0不过这些相对不安全&#xff0c;不能保持当时的状态 重启:reboot/init …

centos8关机命令

centos6.8怎样重启vsftpd服务 安装了vsftpd&#xff0c;发现使用systemctlstopvsftpd&#xff0c;还是可以匿名登录FTP。 然后修改了vsftpd.conf禁用了匿名&#xff0c;但是无法重新启动vsftpd&#xff0c;然后还是可以登录FTP。 [rootnichevsftpd]#whereisvsftpd vsftpd:/usr/…

【sql语句】注释

sql语句注释有两种 一种是块注释语句&#xff1a;和java C里面的注释一样 /* 内容 */ 还有一种是嵌入行内的注释语句&#xff1a; “--”&#xff08;双减号&#xff09;用来创建单行文本注释语句。 --后面需要有一个空格&#xff0c;就是我没敲空格做题才出了问题 空格 …

SQL SERVER创建字段注释

第一种方法是用SQL SERVER的管理工具 表设计中的列属性自带说明&#xff0c;填写会自动生成注释 第二种方法 如果在navicat等工具上无法可视化创建注释的&#xff0c;需要执行语句 EXEC sys.sp_addextendedproperty nameNMS_Description, valueN这是活动类型 , level0typeNSCHE…

SQL Server中怎么给表添加注释

在 SQL Server 中&#xff0c;可以使用 sp_addextendedproperty 存储过程为表添加注释。具体步骤如下&#xff1a; 打开 SQL Server Management Studio&#xff0c;连接到相应的数据库。 在“对象资源管理器”中&#xff0c;展开数据库&#xff0c;找到要添加注释的表。 右键…

SQL注入中,注释#、 --+、 --%20、 %23到底是什么意思?sqli-labs-master

1.# 和 -- &#xff08;有个空格&#xff09;表示注释&#xff0c;可以使它们后面的语句不被执行。在url中&#xff0c;如果是get请求**(记住是get请求&#xff0c;也就是我们在浏览器中输入的url)** &#xff0c;解释执行的时候&#xff0c;url中#号是用来指导浏览器动作的&am…

sql语句,sql文件加注释

单行注释通用-- 如&#xff1a;sql server、oracle、db2等&#xff1b; 多行注释/**/ 如&#xff1a;sql server&#xff0c;其他不知道 access 好象不可以有注释 注释后面好像需要加“;”号 多行的不能直接跟在sql语句后面 单行的添加在sql语句后即可

SQL注入基础知识总结

SQL注入—基础知识总结 1、注释符1.1、Mysql中注释符有三种1.2、总结 2、information_schema库2.1、了解information_schema库2.2、常用注入语句 3、order by3.1、了解order by3.2、order by之判断列数 4、union select4.1、了解union select 1、注释符 SQL注入的时候经常会用到…

linux清理缓存cache,Linux清理cache缓存

当cache缓存占用太大&#xff0c;服务起不来&#xff0c;需要查看清理缓存 查看缓存&#xff1a; free -m 输入运行下面一行&#xff1a; echo 3 > /proc/sys/vm/drop_caches # 释放缓存区内存的方法 1)清理pagecache(页面缓存) # echo 1 > /proc/sys/vm/drop_caches 或者…