linux下的sed和awk命令
一、sed
sed(Stream Editor)是一个强大的流式文本编辑器,可在不进入文件内部的情况下对文本进行高效处理,常用于文本替换、删除、插入等操作。 #基本语法 sed[选项]'脚本' 文件 1.选项 sed 命令有多个选项,用于控制其行为,下面是一些常用选项: -n:只输出经过处理的行,默认情况下 sed 会输出所有行。 -e:允许多个脚本指令,例如 sed -e'脚本1'-e'脚本2' 文件。 -i:直接修改文件内容,而不是输出到标准输出。 注意:sed的所有操作默认不会真正的执行,而是假装运行。但是如果加上-i参数,那就是真正的操作,真正的修改。 2.脚本 由地址和命令组成,用于指定要处理的行和具体操作。 (1)地址用于指定要处理的行,有以下几种常见形式: ①数字:指定具体的行号,例如 3 表示第 3 行。 ②范围:用逗号分隔两个数字表示行的范围,如 3,5 表示第 3 行到第 5 行。 ③正则表达式:用 /正则表达式/ 表示匹配该正则表达式的行,例如 /hello/ 表示匹配包含 hello 的行。 (2)命令包括打印命令p,插入命令i,追加命令a,删除命令d,修改命令c,替换命令s 3.文件 要处理的文本文件,若省略文件参数,sed 会从标准输入读取数据。 #sed示例 1.打印命令 # 打印第 3 行 sed-n'3p' file.txt # 打印第 3 行到第 5 行 sed-n'3,5p' file.txt # 打印包含 hello 的行 sed-n'/hello/p' file.txt #sed输出第3行到行尾 sed-n'3,$p' file.txt 2.插入命令和追加命令 # 在第 3 行之前插入 new line sed'3i new line' file.txt # 在第 3 行之后插入 new line sed'3a new line' file.txt 3.修改命令 # 将第 3 行替换为 new line sed'3c new line' file.txt 4.删除命令 # 删除第 3 行 sed'3d' file.txt # 删除第 3 行到第 5 行 sed'3,5d' file.txt # 删除包含 hello 的行 sed'/hello/d' file.txt 5.替换命令 # 将每行的第一个 hello 替换为 world sed's/hello/world/' file.txt # 将每行的所有 hello 替换为 world sed's/hello/world/g' file.txt # 只替换第 3 行到第 5 行的 hello 为 world sed'3,5s/hello/world/g' file.txt 6.引用变量 old="hello"new="world"sed"s/$old/$new/g" file.txt 7.真正通过sed修改文件内容 (1)备份原文件,防止sed修改错误导致文件内容无法还原 cp file.txt file.txt.bak (2)删除第 3 行 sed-i'3d' file.txt
二、awk
#基本介绍 awk是一种强大的文本处理工具,在 Linux 和 Unix 系统中广泛使用,可用于数据提取、格式化、统计分析等多种场景。 awk会逐行读取文件内容,将每一行看作一个独立的处理单元。就像把文件整体打碎成一行一行的“碎片”。接着,针对每一行,awk会根据指定的字段分隔符(默认是空格或制表符),把行内容进一步分割成多个字段,这类似于把每一行“碎片”又拆分成更小的“碎片”。 例如,有一个名为students.txt的文件,内容如下: cat>> students.txt <Alice 20 Math Bob 22 English Charlie 21 History END awk在处理这个文件时,会逐行读取,对于第一行Alice 20 Math,以空格为分隔符,将其分割成三个字段Alice、20、Math。 awk可以根据需求输出想要的对应碎片的内容,具体是通过模式匹配与动作执行来实现的。awk允许用户通过定义模式和动作来筛选和处理这些“碎片”。模式用于指定要处理的行,动作则定义了对符合模式的行要执行的操作。 示例:只输出年龄大于 20 的学生信息 awk'$2 > 20 {print $0}' students.txt 这里$2> 20是模式,用于筛选出第二个字段(年龄)大于 20 的行;{print $0}是动作,用于打印符合条件的整行内容。执行该命令后,输出结果为: Bob 22 English #基本语法 awk'模式 {动作}' 文件 模式:用于筛选符合条件的行,可使用正则表达式、比较表达式等,省略模式时默认处理所有行。 动作:对符合模式的行执行的操作,通常用花括号括起来,可包含变量赋值、输出语句等。 #内置变量 $0:代表当前处理的整行内容。 $n:n为正整数,$n表示当前行的第n个字段,例如$1是第一个字段,$2是第二个字段。NF:表示当前行的字段数量。 NR:表示当前处理的行号。 FS:输入字段分隔符,默认是空格或制表符,可通过-F选项或在awk脚本中设置修改。 #常见模式 正则表达式模式:用 /正则表达式/ 表示,匹配包含该正则表达式的行。 #awk比较操作符模式 awk 也支持使用比较操作符来定义模式,比如相等(==)、不等(!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)。 比较表达式模式:如$1> 10,表示第一个字段大于 10 的行。 范围模式:如 NR == 1, NR == 5,表示处理第 1 行到第 5 行。 #awk复合模式 复合模式允许用户将多个模式结合起来,使用逻辑操作符&&(逻辑与)、||(逻辑或)以及 !(逻辑非)。 #创建动作 print:是一个简单直接的输出命令,主要用于将变量、字段或字符串等内容输出到标准输出。它会自动在每个输出项之间添加输出字段分隔符(由OFS变量控制,默认是空格),并在每行输出的末尾添加输出记录分隔符(由ORS变量控制,默认是换行符)。 printf:是格式化输出命令,类似于 C 语言中的printf函数。它允许你按照指定的格式输出内容,提供了更精细的输出控制,包括字段宽度、精度、对齐方式等。 #awk使用示例 1.awk输出文件内容 [root@centos79-68-78 src]# awk '{print}' students.txtAlice 20 Math Bob 22 English Charlie 21 History [root@centos79-68-78 src]# awk '{print $0}' students.txtAlice 20 Math Bob 22 English Charlie 21 History [root@centos79-68-78 src]# awk '{print $1}' students.txtAlice Bob Charlie 2.输出指定行 [root@centos79-68-78 src]# awk 'NR==3 {print $0}' students.txtCharlie 21 History [root@centos79-68-78 src]# awk 'NR==3' students.txtCharlie 21 History [root@centos79-68-78 src]# awk 'NR==2,NR==3' students.txtBob 22 English Charlie 21 History 3.awk通过分隔符,输出指定列 [root@centos79-68-78 src]# awk -F" "'{ print $2,$3 }' students.txt20 Math 22 English 21 History [root@centos79-68-78 src]# awk -F" "'{ print "第2列: "$2, "\t第3列: "$3 }' students.txt第2列: 20第3列: Math 第2列: 22第3列: English 第2列: 21第3列: History #awk输出最后一列 [root@centos79-68-78 src]# awk '{print $NF}' students.txtMath English History [root@centos79-68-78 src]# awk -F' ''{print $NF}' students.txtMath English History 4.awk消除空自行 [root@centos79-68-78 src]# awk NF students.txtAlice 20 Math Bob 22 English Charlie 21 History 5.awk输出前N列 [root@centos79-68-78 src]# awk -F" "'NF=2' students.txtAlice 20 Bob 22 Charlie 21 #条件判断和计算复合模式的awk示例 cat>> data.txt << END Alice 80 90 70 Bob 60 70 80 Charlie 90 95 92 END #计算每个学生的平均成绩,并输出平均成绩大于 80 分的学生信息,用awk可以轻松实现 [root@centos79-68-78 src]# awk '{sum = $2 + $3 + $4; avg = sum / 3; if (avg > 80) print $1, avg}' data.txt Charlie 92.3333