Linux文本处理awk、sed

文本处理指令:awk、sed。

  • awk: 强大的文本处理工具,可以用于查看、排序和提取指标。例如,awk '{print $1}' 文件名 | sort | uniq -c | sort -nr 可以提取第一列的内容,排序,并显示每个不同值的出现次数。
  • sed: 流编辑器,用于对文本进行过滤和转换。

文本分析/提取-Awk

awk是一个强大的文本分析工具,主要用于模式扫描和文本/数据提取,是UNIX/Linux系统中的标准工具之一。

一、基本语法

awk的基本使用格式如下:

1
awk [options] 'pattern { action }' file_name
  • options:awk命令的选项,用于控制awk的行为。
  • pattern:匹配模式或条件,决定何时执行action。
  • action:当模式匹配时要执行的命令或操作。
  • file_name:要处理的文件或输入源。

二、常用选项

awk命令的一些常用选项包括:

  • -F fs:指定输入记录的字段分隔符,fs为分隔符。如果省略该选项,awk使用环境变量IFS的值,默认为空格或制表符。
  • -v var=value:为awk_script设置变量,var是变量名,value是变量的值。
  • -f filename:从文件filename中读取awk_script。

三、模式与动作

awk的工作方式是基于模式和动作的。模式决定何时执行动作,而动作定义了当模式匹配时要执行的操作。

  • 模式可以是正则表达式、布尔表达式、范围模式等。正则表达式用于匹配文本行,布尔表达式用于比较字段值或执行复杂的逻辑判断。
  • 动作通常包含一系列的awk命令,这些命令可以是打印字段、计算值、修改变量等。动作被大括号{}包围。

四、内置变量

awk内置了许多变量,用于处理文本和数据。以下是一些常用的内置变量:

  • $0:表示当前记录(行)的文本。
  • $1, $2, …:表示当前记录的第1个、第2个等字段,字段由FS变量指定的分隔符分隔。
  • NR:表示当前处理的是第几行。
  • NF:表示当前记录有多少个字段。
  • FS:输入字段分隔符,默认为空格或制表符。
  • OFS:输出字段分隔符,默认为空格。
  • ORS:输出记录分隔符,默认为换行符。
  • FILENAME:当前输入文件的名称。

五、常用动作

awk的动作可以执行各种文本处理任务,以下是一些常用动作:

  • print:打印当前记录或字段。
  • printf:格式化打印文本。
  • if-else:执行条件判断。
  • for-in:遍历数组。
  • gsubsub:替换文本。
  • length:返回字符串长度。
  • split:将字符串分割成数组。

六、实例

以下是一些awk命令的实例:

  1. 打印文件中的所有行
1
awk '{print $0}' file_name
  1. 打印每行的第一个字段
1
awk '{print $1}' file_name
  1. 使用自定义分隔符打印字段
1
awk -F: '{print $1}' /etc/passwd

这个命令使用冒号:作为字段分隔符,打印/etc/passwd文件中每行的第一个字段,通常是用户名。

  1. 计算文件中第一列的总和
1
awk '{sum += $1} END {print sum}' file_name

这个命令遍历文件file_name中的每一行,将第一列的值累加到变量sum中,最后打印总和。

  1. 统计文件中每个唯一值的出现次数
1
awk '{arr[$1]++} END {for(i in arr) print i, arr[i]}' file_name

这个命令使用一个关联数组arr来统计文件中每个唯一值(第一列的值)的出现次数,并在处理完所有行后打印结果。

七、注意事项

  • awk命令默认会将输入文件的数据读入内存,然后操作内存中的输入数据副本,因此处理大文件时需要注意内存使用情况。
  • awk命令的输出默认是标准输出,如果需要重定向到文件,可以使用重定向操作符>
  • awk命令的语法和选项可能会因不同版本的awk(如awk、nawk、gawk)而有所不同,但大多数基本用法是通用的。

流编辑器-Sed

sed(Stream EDitor)是一种强大的文本处理工具,它在Linux/UNIX系统中被广泛使用。sed主要用于自动编辑一个或多个文件,简化对文件的反复操作,以及编写转换程序等。

一、sed命令简介

sed是一种在线编辑器,它一次处理一行内容。处理时,sed会把当前处理的行存储在临时缓冲区中,这个缓冲区被称为“模式空间”(pattern space)。接着,sed命令会在模式空间中处理这些内容,处理完成后,把缓冲区的内容送往屏幕。然后,sed会处理下一行,直到文件末尾。默认情况下,文件内容并不会被改变,除非使用重定向来存储输出。

二、sed命令的格式与选项

1. 命令格式

sed的基本命令格式如下:

1
sed [options] 'scripts' inputfile

或者,当sed命令较为复杂时,可以将sed脚本写入一个文件中,并使用-f选项来指定这个文件:

1
sed -f scriptfile inputfile

2. 常用选项

  • -n:静默模式,不打印模式空间中的内容,而是仅打印和sed命令匹配的内容。
  • -e:允许多点编辑,即在一条sed命令中执行多个脚本。多个脚本之间使用分号;分隔。
  • -f:从文件中读取sed脚本。
  • -i:直接修改文件内容,而不是输出到屏幕上。如果加后缀,则会先重命名原文件,再创建一个新文件。
  • -r:使用扩展正则表达式。

三、sed命令的地址与操作

sed命令中的地址用于指定要对哪些行进行操作。地址可以是行号,也可以是正则表达式。操作则是对指定行执行的动作,如删除、替换、打印等。

地址格式

  • N:匹配第N行。
  • $:匹配最后一行。
  • N~step:从第N行开始,每隔step行匹配一次,如1~2表示奇数行。
  • /regexp/:匹配包含正则表达式的行。
  • N,M:匹配从第N行到第M行。
  • N,+M:匹配从第N行开始,向后匹配M行。

常用操作

  • a\:在匹配行的下一行追加内容。
  • i\:在匹配行的上一行插入内容。
  • c\:替换匹配行的内容。
  • d:删除匹配行。
  • p:打印匹配行。通常与-n选项一起使用。
  • s/regexp/replacement/flags:替换匹配的内容。flags可以是g(全局替换)、i(忽略大小写)等。

四、sed的高级特性

模式空间与保持空间

  • 模式空间:sed处理文本内容行的临时缓冲区。处理完成后,内容会被送往屏幕(除非使用重定向),然后模式空间会被清空,准备处理下一行。
  • 保持空间:sed的另一个临时缓冲区,用于存储临时数据。保持空间的内容不会自动清空,也不会自动打印到标准输出,而是需要sed命令来进行处理。

交互命令

  • h:将模式空间的内容复制到保持空间(覆盖方式)。
  • H:将模式空间的内容追加到保持空间。
  • g:将保持空间的内容复制到模式空间(覆盖方式)。
  • G:将保持空间的内容追加到模式空间。

五、使用场景与示例

sed命令在文本处理中非常强大,可以用于删除、替换、添加文本行,以及执行复杂的文本转换。以下是一些使用示例:

  • 打印文件的前两行:sed -n '1,2p' filename
  • 删除文件中的空行:sed '/^$/d' filename
  • 将文件中的"apple"替换为"orange":sed 's/apple/orange/g' filename