Linux文本处理awk、sed
文本处理指令:awk、sed。
- awk: 强大的文本处理工具,可以用于查看、排序和提取指标。例如,
awk '{print $1}' 文件名 | sort | uniq -c | sort -nr
可以提取第一列的内容,排序,并显示每个不同值的出现次数。 - sed: 流编辑器,用于对文本进行过滤和转换。
文本分析/提取-Awk
awk是一个强大的文本分析工具,主要用于模式扫描和文本/数据提取,是UNIX/Linux系统中的标准工具之一。
一、基本语法
awk的基本使用格式如下:
|
|
- 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:遍历数组。
- gsub、sub:替换文本。
- length:返回字符串长度。
- split:将字符串分割成数组。
六、实例
以下是一些awk命令的实例:
- 打印文件中的所有行:
|
|
- 打印每行的第一个字段:
|
|
- 使用自定义分隔符打印字段:
|
|
这个命令使用冒号:
作为字段分隔符,打印/etc/passwd
文件中每行的第一个字段,通常是用户名。
- 计算文件中第一列的总和:
|
|
这个命令遍历文件file_name
中的每一行,将第一列的值累加到变量sum
中,最后打印总和。
- 统计文件中每个唯一值的出现次数:
|
|
这个命令使用一个关联数组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的基本命令格式如下:
|
|
或者,当sed命令较为复杂时,可以将sed脚本写入一个文件中,并使用-f
选项来指定这个文件:
|
|
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