个人用云计算学习笔记 --21(Linux 文本处理工具与正则表达式)
文章目录
- Linux 文本处理工具与正则表达式
- 一、Linux 正则表达式
- (一)核心元字符与功能
- 1. 字符集匹配
- 2. 通用匹配与转义
- 3. 逻辑与限定匹配
- 4. 定位与边界匹配
- 5. 子表达式与反向引用
- 6. 非打印字符匹配
- 二、grep 命令
- (一)基础语法
- (二)核心选项分类与用法
- 1. 模式选择与解释(控制正则表达式类型)
- 2. 输出控制(控制匹配结果的显示形式)
- 3. 查找文件(控制文件 / 目录的搜索范围)
- 4. 上下文控制(显示匹配行的前后内容)
- 三、sed 命令
- (一)工作流程
- (二)基础语法
- (三)核心选项
- (四)核心操作命令
- 1. 打印(`p`/`P`)
- 2. 删除(`d`/`D`)
- 3. 替换(`s`/`c`)
- 4. 插入(`i`/`a`)
- 5. 保持空间操作(`h`/`H`/`g`/`G`)
- 6. 其他常用命令
- 四、awk 命令
- (一)工作流程
- (二)基础语法
- (三)核心选项
- (四)核心内置变量
- (五)核心功能与示例
- 1. 模式匹配(`pattern`部分)
- 2. 动作处理(`action`部分)
- (1)变量与计算
- (2)循环语句
- (3)数组
- (4)函数
- (5)格式化输出(`printf`)
- 3. 输入输出重定向
- 五、工具对比与适用场景
Linux 文本处理工具与正则表达式
一、Linux 正则表达式
正则表达式是由普通字符(大小写字母、数字、标点等可打印 / 不可打印字符)和元字符(特殊功能字符)组成的文字模式,用于匹配字符串,支持vim
、grep
、Perl
、Python
等工具与编程语言,分为普通正则表达式(基础元字符)和扩展正则表达式(支持更多元字符,需用egrep
或grep -E
调用)。
(一)核心元字符与功能
1. 字符集匹配
用于限定匹配的字符范围,精准筛选目标字符。
元字符 | 功能 | 示例 |
---|---|---|
[...] | 匹配集合内任意一个字符 | c[ab]t 匹配cat 、cbt (匹配c 后接a /b 再接t ) |
[^...] | 匹配除集合内字符外的所有字符 | c[^ab]t 匹配c1t 、c-t (排除a /b ) |
[a-z] /[A-Z] /[0-9] | 分别匹配小写字母、大写字母、数字 | c[a-z]t 匹配cat 、cbt ;c[0-9]t 匹配c1t |
[-a-zA-Z0-9] | 匹配- 、字母、数字(- 需放集合首位) | c[-a-zA-Z0-9]t 匹配cat 、c-t 、c1t 、cCt |
预定义字符集 | 简化常用范围,格式[[:xxx:]] | - [[:digit:]] :等效[0-9] (数字)- [[:lower:]] :等效[a-z] (小写字母)- [[:alnum:]] :等效[a-zA-Z0-9] (字母数字)- [[:punct:]] :匹配所有标点(如!@#$%^&* ) |
2. 通用匹配与转义
处理 “任意字符” 或 “元字符转义”,解决特殊字符匹配问题。
元字符 | 功能 | 示例 |
---|---|---|
. | 匹配除换行符外的任意单个字符 | c.t 匹配cat 、c1t 、c-t 、c.Ct |
\ | 转义符:将元字符转为原义字符 | - c\.t 匹配c.t (转义. ,避免其作 “任意字符”)- \n 匹配换行符,\\ 匹配\ |
3. 逻辑与限定匹配
控制匹配的逻辑选择(二选一)和重复次数,满足复杂场景。
元字符 | 功能 | 示例 | ||
---|---|---|---|---|
` | ` | 二选一匹配(扩展正则,需egrep /grep -E ) | `cat | dog匹配 cat或 dog` |
* | 匹配前面子表达式 0 次及以上 | do*g 匹配dg (0 个o )、dog (1 个o )、doog (2 个o ) | ||
+ | 匹配前面子表达式 1 次及以上(扩展正则) | do+g 匹配dog 、doog (排除dg ) | ||
? | 匹配前面子表达式 0 次或 1 次(扩展正则) | do?g 匹配dg 、dog (排除doog ) | ||
{m} | 匹配前面子表达式 exactly m 次(扩展正则) | do{2}g 仅匹配doog (2 个o ) | ||
{m,n} | 匹配前面子表达式m-n 次(扩展正则) | do{2,3}g 匹配doog (2 个o )、dooog (3 个o ) | ||
{m,} | 匹配前面子表达式至少m 次(扩展正则) | do{2,}g 匹配doog 、dooog 、doooog | ||
{,n} | 匹配前面子表达式最多n 次(扩展正则) | do{,3}g 匹配dg 、dog 、doog 、dooog (排除 4 个o ) |
4. 定位与边界匹配
限定匹配的位置(行首 / 行尾、单词边界),避免歧义。
元字符 | 功能 | 示例 |
---|---|---|
^ | 匹配行首 | ^cat 匹配以cat 开头的行(如cat ,排除acat ) |
$ | 匹配行尾 | cat$ 匹配以cat 结尾的行(如cat 、acat ) |
\b | 匹配单词边界(单词与空格 / 符号的间隔) | - \bcat 匹配 “hello cat” 中的cat (排除category )- cat\b 匹配 “acat”“hello cat” 中的cat (排除category )- \bcat\b 仅匹配独立单词cat (如cat 、“hello cat”) |
\B | 非单词边界匹配 | \Bcat 匹配acat 、concatenate 中的cat (排除独立cat ) |
< /> | 分别匹配单词左 / 右边界 | - <cat 匹配 “cat”“category” 中的cat (左边界)- cat> 匹配 “cat”“acat” 中的cat (右边界) |
5. 子表达式与反向引用
通过分组和引用,实现复杂模式匹配(如重复字符串)。
元字符 | 功能 | 示例 |
---|---|---|
() | 标记子表达式(分组),匹配结果存入临时缓冲区 | (dog){2} 匹配dogdog (2 个dog );(dog){2,3} 匹配dogdog 、dogdogdog |
\N | 反向引用:引用第N 个缓冲区的子表达式(N 为 1-99) | - egrep -o '\b([a-z]+)\1\b' 匹配 “of of”“up up”(重复单词)- egrep -o '(laoma)(laoniu).*\1' 匹配 “laoma laoniu laohu laoma”(引用第一个子表达式laoma ) |
6. 非打印字符匹配
处理终端不显示的字符(如换行、制表符)。
元字符 | 功能 | 示例 |
---|---|---|
\n | 匹配换行符 | grep '\n' file (需特殊处理换行符场景) |
\t | 匹配制表符 | grep 'cat\t' file 匹配 “cat ”(cat 后接制表符) |
\r | 匹配回车符 | grep '\r' file 处理 Windows 格式文件的回车符 |
\s | 匹配任意空白字符(空格、制表符、换页符等) | grep 'c\st' file 匹配c t (空格)、c\t t (制表符) |
\w | 匹配字母、数字、下划线(等效[a-zA-Z0-9_] ) | grep '\w*t' file 匹配cat 、123t 、_t |
\W | 匹配非单词字符(等效[^a-zA-Z0-9_] ) | grep '\Wt' file 匹配-t 、@t |
二、grep 命令
grep
是 Linux 文本处理 “三剑客” 之一,核心功能是从文本文件或管道数据流中筛选匹配的行及数据,擅长快速过滤,支持正则表达式。
(一)基础语法
过滤管道数据流:command | grep [OPTION]… PATTERNS
例:cat words | grep ‘cat’(从cat words的输出中筛选含cat的行)
过滤文件:grep [OPTION]… PATTERNS [FILE]…
例:grep ‘cat’ words(从words文件中筛选含cat的行)
(二)核心选项分类与用法
1. 模式选择与解释(控制正则表达式类型)
选项 | 功能 | 示例 |
---|---|---|
-E /--extended-regexp | 支持扩展正则表达式(等效egrep ) | grep -E '(dog){2}' words (匹配dogdog ) |
-F /--fixed-strings | 将PATTERNS 视为普通字符串(不解析元字符) | grep -F 'c.t' words (仅匹配c.t ,不匹配cat ) |
-P /--perl-regexp | 支持 Perl 风格正则表达式 | grep -P '\bcat\b' words (Perl 风格单词边界) |
-e PATTERN | 指定多个匹配模式(多-e 联用) | grep -e 'cat' -e 'dog' words (匹配cat 或dog ) |
-f FILE | 从文件读取匹配模式(每行一个模式) | 1. echo -e 'cat\ndog' > pattens.txt (创建模式文件)2. grep -f pattens.txt words (从文件读取模式) |
-i /--ignore-case | 忽略大小写匹配 | grep -i 'CBT' words (匹配cbt ) |
-w /--word-regexp | 仅匹配整个单词(等效\b...\b ) | grep -w 'cat' words (匹配cat 、“hello cat”,排除category ) |
-X /--line-regexp | 仅匹配整行(需行内容与模式完全一致) | grep -X 'cat' words (仅匹配内容为cat 的行) |
2. 输出控制(控制匹配结果的显示形式)
选项 | 功能 | 示例 |
---|---|---|
-v /--invert-match | 反向匹配:显示不匹配的行 | `grep -v '^d |
-c /--count | 仅显示匹配行的数量 | grep -c 'dog' words (统计含dog 的行数) |
-n /--line-number | 显示匹配行的行号 | grep -n 'cat' words (输出 “1:cat”“2:category”) |
-o /--only-matching | 仅显示匹配的内容(不显示整行) | grep -o 'cat' words (仅输出cat ,不输出行内其他内容) |
-q /--quiet | 静默模式:无任何正常输出(用$? 判断结果) | 1. grep -q 'dog' words (无输出)2. echo $? (匹配成功返回0 ,失败返回1 ) |
-b /--byte-offset | 显示匹配内容在该行的字节偏移量 | grep -b 'cat' words (输出 “0:cat”“4:category”,0 为字节偏移) |
--color[=WHEN] | 高亮显示匹配内容(WHEN :always /never /auto ) | grep --color 'cat' words (cat 部分高亮) |
3. 查找文件(控制文件 / 目录的搜索范围)
选项 | 功能 | 示例 |
---|---|---|
-r /--recursive | 递归搜索目录(处理子目录文件) | grep -r 'SELINUX=' /etc (递归搜索/etc 下含SELINUX= 的文件) |
-R /--dereference-recursive | 递归搜索并跟随软链接 | grep -R 'SELINUX=' /etc (处理软链接指向的文件) |
-h /--no-filename | 不显示匹配行所在的文件名 | grep -h 'cat' file1 file2 (仅输出匹配行,不输出file1 /file2 ) |
-H /--with-filename | 显示匹配行所在的文件名(默认,多文件时生效) | grep -H 'cat' file1 file2 (输出 “file1:cat”“file2:acat”) |
-l /--files-with-matches | 仅显示含匹配模式的文件名 | grep -r -l 'SELINUX=' /etc (仅输出含SELINUX= 的文件路径) |
-L /--files-without-match | 仅显示不含匹配模式的文件名 | grep -r -L 'SELINUX=' /etc (仅输出不含SELINUX= 的文件路径) |
--include=GLOB | 仅搜索匹配GLOB 模式的文件 | grep -r --include='*.conf' 'SELINUX=' /etc (仅搜索.conf 文件) |
--exclude=GLOB | 排除匹配GLOB 模式的文件 | grep -r --exclude='*.log' 'SELINUX=' /etc (排除.log 文件) |
4. 上下文控制(显示匹配行的前后内容)
选项 | 功能 | 示例 | |
---|---|---|---|
-B NUM /--before-context=NUM | 显示匹配行及前NUM 行 | `ip addr | grep ‘10.1.8.88’ -B 2(显示 10.1.8.88` 行及前 2 行) |
-A NUM /--after-context=NUM | 显示匹配行及后NUM 行 | `ip addr | grep ‘ens32:’ -A 2(显示 ens32:` 行及后 2 行) |
-C NUM /--context=NUM | 显示匹配行及前后NUM 行(等效-NUM ) | `ip addr | grep ‘10.1.8.88’ -C 2(显示 10.1.8.88` 行及前后 2 行) |
三、sed 命令
sed
(Stream Editor,流编辑器)是 Linux “三剑客” 之一,核心功能是非交互式修改文本(替换、删除、插入、打印等),基于 “模式空间(pattern space)” 和 “保持空间(hold space)” 处理数据,默认不修改源文件(需-i
选项实现原地修改)。
(一)工作流程
-
读取行:从输入流(文件 / 管道 / 标准输入)读取一行,存入模式空间(内存临时区域),记录当前行号。
-
执行命令:按
sed
命令对模式空间中的行执行操作(如替换、删除),可指定行号或模式筛选目标行。 -
显示结果:将处理后的行发送到输出流(文件 / 管道 / 标准输出),清空模式空间。
-
循环:重复 1-3 步骤,直到输入流处理完毕。
注:保持空间(hold space)用于暂存数据,不自动清空,需用h、H、g、G
命令操作,用于跨行数据处理。
(二)基础语法
sed [OPTION] [sed-command] [input-file]
OPTION
:命令行选项(如-n
/-i
/-r
)。sed-command
:具体操作命令(如d
/s
/p
)。input-file
:输入文件(不指定则从标准输入读取)。
(三)核心选项
选项 | 功能 | 示例 |
---|---|---|
-n /--quiet | 取消自动打印模式空间(需p 命令显式打印) | sed -n '1p' data.txt (仅打印第 1 行,不输出其他行) |
-e SCRIPT | 执行多个sed 命令(用分号分隔或多-e 联用) | sed -e '1d;2d' data.txt (删除第 1、2 行) |
-f FILE | 从文件读取sed 命令(每行一个命令) | 1. echo -e '1d\n2d' > scripts.txt (创建命令文件)2. sed -f scripts.txt data.txt (执行文件中的命令) |
-i [SUFFIX] | 原地修改文件(SUFFIX 为备份后缀,如-i.bak ) | sed -i.bak 's/root/tank/' test (修改test ,备份为test.bak ) |
-r /--regexp-extended | 支持扩展正则表达式(无需转义() /{} 等) | sed -r 's/(zhangy)/zhangying/' test (扩展正则分组) |
--follow-symlinks | 原地修改时跟随软链接 | sed -i --follow-symlinks 's/old/new/' link.txt (处理软链接文件) |
(四)核心操作命令
1. 打印(p
/P
)
命令 | 功能 | 示例 |
---|---|---|
p | 打印模式空间所有内容 | sed -n '3p' data.txt (打印第 3 行) |
P | 打印模式空间第一行(用于多行模式) | sed -n 'N;P' data.txt (读取 2 行,打印第一行) |
行号 / 模式寻址 | 按行号或模式筛选目标行 | - 行号:sed -n '1,3p' data.txt (打印第 1-3 行)- 模式:sed -n '/root/p' test (打印含root 的行)- 混合:sed -n '/^root/,3p' test (打印root 开头行到第 3 行) |
2. 删除(d
/D
)
命令 | 功能 | 示例 |
---|---|---|
d | 删除模式空间所有内容(不输出) | sed '3d' data.txt (删除第 3 行) |
D | 删除模式空间第一行(用于多行模式) | sed 'N;D' data.txt (读取 2 行,删除第一行,保留第二行) |
行号 / 模式寻址 | 按行号或模式筛选删除行 | - 行号:sed '1,14d' test (删除第 1-14 行)- 模式:`sed '/false |
3. 替换(s
/c
)
命令 | 功能 | 示例 |
---|---|---|
s/旧值/新值/[选项] | 替换模式空间中的内容(默认分隔符/ ,可自定义如# /@ ) | - 基础替换:sed 's/my/your/' test1.txt (替换每行第一个my )- 全局替换:sed 's/my/your/g' test1.txt (替换每行所有my )- 指定次数:sed 's/my/your/3' test1.txt (替换每行第 3 个my )- 自定义分隔符:sed 's#/root#/home#g' test (替换/root 为/home ,避免/ 转义) |
c 新内容 | 替换整行(用新内容 替换目标行) | sed '/^root/c hello' test (将root 开头的行替换为hello ) |
4. 插入(i
/a
)
命令 | 功能 | 示例 |
---|---|---|
i 内容 | 在目标行上方插入新行 | sed '/root/i ===iiii===' test (在root 行上方插入===iiii=== ) |
a 内容 | 在目标行下方插入新行 | sed '/root/a ===aaaa===' test (在root 行下方插入===aaaa=== ) |
5. 保持空间操作(h
/H
/g
/G
)
用于跨行数据暂存与调用,解决 “多行处理” 场景。
命令 | 功能 | 示例 |
---|---|---|
h | 覆盖保持空间(用模式空间内容替换保持空间) | sed -e '/root/h' -e '$G' test (将root 行存入保持空间,在最后一行下方插入) |
H | 追加保持空间(将模式空间内容追加到保持空间,换行分隔) | sed -e '/root/H' -e '$G' test (追加root 行到保持空间,最后一行下方插入) |
g | 覆盖模式空间(用保持空间内容替换模式空间) | sed -e '/root/h' -e '/zhangy/g' test (用root 行替换zhangy 行) |
G | 追加模式空间(将保持空间内容追加到模式空间,换行分隔) | sed 'G' test (在每行下方插入空行,因保持空间默认空,追加后换行) |
6. 其他常用命令
命令 | 功能 | 示例 |
---|---|---|
y/源字符/目标字符 | 字符转换(一对一替换,长度需一致) | sed 'y/si/SI/' test (s→S 、i→I ,如This→ThIS ) |
r FILE | 读取文件内容,插入到目标行下方 | sed '/^root/r test2.txt' test (在root 行下方插入test2.txt 内容) |
w FILE | 将模式空间内容写入文件 | sed -n '/^root/w test3.txt' test (将root 行写入test3.txt ) |
q [NUM] | 退出sed (NUM 为退出码) | sed '2q' test (处理完第 2 行后退出,仅输出前 2 行) |
! | 取反:对未匹配的行执行命令 | sed -n '/root/!p' test (打印不含root 的行) |
四、awk 命令
awk
是 Linux “三剑客” 之一,核心功能是文本分析与格式化输出,支持变量、循环、数组、函数等编程语言特性,擅长 “按列处理”(如提取字段、统计数据),默认按行读取、按字段分割(默认分隔符为空格 / 制表符)。
(一)工作流程
- 执行
BEGIN
块:在读取输入前执行(仅一次),用于变量初始化、打印表头。 - 逐行处理
pattern{action}
块:从输入流读取一行,按pattern
筛选(如正则 / 条件),匹配则执行action
(如打印 / 计算),循环至所有行处理完毕。 - 执行
END
块:读取所有行后执行(仅一次),用于输出统计结果、打印表尾。
(二)基础语法
- 直接执行:
awk [OPTIONS] 'BEGIN{action} pattern{action} END{action}' [FILE]
- 脚本文件:
awk [OPTIONS] -f script.awk [FILE]
(从文件读取脚本)
(三)核心选项
选项 | 功能 | 示例 |
---|---|---|
-F fs /--field-separator=fs | 指定字段分隔符(默认空格 / 制表符) | awk -F ':' '{print $1,$6}' /etc/passwd (按: 分割,打印第 1、6 字段) |
-v var=val /--assign=var=val | 预定义变量(在BEGIN 块前生效) | awk -v NUM=10 'BEGIN{print NUM}' (输出10 ) |
-f FILE | 从文件读取awk 脚本(每行一个命令) | 1. vim script.awk (写入BEGIN{print "Hello"} )2. awk -f script.awk (执行脚本) |
-p PROFILE /--profile=PROFILE | 生成脚本格式化文件(便于调试) | awk --profile -f script.awk > awkprof.out (生成格式化脚本) |
-d [FILE] /--dump-variables=[FILE] | 导出内置变量到文件(默认awkvars.out ) | awk -d (生成awkvars.out ,含所有内置变量) |
(四)核心内置变量
变量 | 功能 | 示例 | ||
---|---|---|---|---|
$0 | 整行内容 | awk '{print $0}' employee.txt (打印整行) | ||
$n | 第n 个字段(n 为正整数,$1 为第一字段) | awk -F ':' '{print $1}' /etc/passwd (打印用户名,第 1 字段) | ||
NF | 当前行的字段总数(Number of Fields) | awk '{print NF}' employee.txt (打印每行字段数) | ||
NR | 当前行号(全局,多文件时连续计数) | awk '{print NR,$0}' file1 file2 (打印行号 + 内容,跨文件连续) | ||
FNR | 当前文件的行号(多文件时重置,仅对当前文件) | awk '{print FNR,$0}' file1 file2 (打印行号 + 内容,每个文件从 1 开始) | ||
FS | 输入字段分隔符(等效-F ,默认[[:space:]] ) | awk 'BEGIN{FS=":"}{print $1}' /etc/passwd (按: 分割) | ||
OFS | 输出字段分隔符(默认空格) | `awk 'BEGIN{OFS=" | "}{print $1,$2}’ employee.txt(输出用 | ` 分隔字段) |
RS | 输入记录分隔符(默认换行符\n ) | awk 'BEGIN{RS=","}{print $0}' data.txt (按, 分割行) | ||
ORS | 输出记录分隔符(默认换行符\n ) | `awk 'BEGIN{ORS=" | "}{print $0}’ data.txt(输出用 | ` 分隔行) |
FILENAME | 当前处理的文件名(BEGIN 块中为空) | awk 'END{print FILENAME}' employee.txt (输出employee.txt ) | ||
IGNORECASE | 正则匹配时忽略大小写(非 POSIX,gawk 支持) | awk 'BEGIN{IGNORECASE=1}/ROOT/{print $0}' /etc/passwd (匹配root ) |
(五)核心功能与示例
1. 模式匹配(pattern
部分)
用于筛选目标行,支持正则、条件、行号等。
模式类型 | 示例 | 功能 |
---|---|---|
正则表达式 | awk '/root/{print $0}' /etc/passwd | 打印含root 的行 |
行号 | awk 'NR==3{print $0}' employee.txt | 打印第 3 行 |
行号范围 | awk 'NR>=2 && NR<=5{print $0}' employee.txt | 打印第 2-5 行 |
条件判断 | awk '$4>23{print $0}' employee.txt | 打印第 4 字段(年龄)大于 23 的行 |
模式匹配运算符 | awk '$2~"张三"{print $0}' employee.txt | 第 2 字段(姓名)匹配张三 的行(~ :匹配,!~ :不匹配) |
2. 动作处理(action
部分)
用于处理匹配的行,支持变量、循环、函数等。
(1)变量与计算
-
自定义变量:无需声明,直接赋值(如
count=0
)。 -
算术运算:支持+、-、*、/、%、**
(幂运算)。
示例:统计技术部员工人数
awk '$3=="技术部"{count++} END{print "技术部人数:"count}' employee.txt
(2)循环语句
支持for
/while
/do-while
,语法与 C 语言类似。
循环类型 | 示例 | 功能 |
---|---|---|
for 循环 | awk 'BEGIN{for(i=1;i<=5;i++) print i}' | 循环输出 1-5 |
while 循环 | awk 'BEGIN{i=1;while(i<=5){print i;i++}}' | 循环输出 1-5 |
do-while 循环 | awk 'BEGIN{i=1;do{print i;i++}while(i<=5)}' | 循环输出 1-5(至少执行一次) |
循环控制 | awk 'BEGIN{for(i=1;i<=10;i++){if(i%2==0) continue;print i}}' | 输出 1-10 中的奇数(continue 跳过偶数) |
(3)数组
awk
仅支持关联数组(索引可为字符串 / 数字,无需声明大小),常用操作:
- 创建数组:
arr["key"]=value
(如arr["张三"]=23
)。 - 遍历数组:
for(key in arr) {print key, arr[key]}
。 - 删除元素:
delete arr["key"]
。
示例:统计单词出现次数
echo "hello world hello awk" | awk '{for(i=1;i<=NF;i++) count[$i]++} END{for(word in count) print word, count[word]}'
# 输出:hello 2; world 1; awk 1
(4)函数
awk
支持内置函数与自定义函数,常用内置函数如下:
函数类别 | 函数 | 功能 | 示例 |
---|---|---|---|
字符串函数 | length(str) | 计算字符串长度 | awk 'BEGIN{print length("hello")}' (输出5 ) |
sub(旧,新,str) | 替换第一个匹配内容 | awk 'BEGIN{str="hello";sub("l","x",str);print str}' (输出hexlo ) | |
gsub(旧,新,str) | 替换所有匹配内容 | awk 'BEGIN{str="hello";gsub("l","x",str);print str}' (输出hexxo ) | |
substr(str,start[,len]) | 提取子串(start 从 1 开始) | awk 'BEGIN{print substr("hello",2,3)}' (输出ell ) | |
算术函数 | int(x) | 取整(截断小数) | awk 'BEGIN{print int(3.8)}' (输出3 ) |
sqrt(x) | 计算平方根 | awk 'BEGIN{print sqrt(16)}' (输出4 ) | |
rand() | 生成 0-1 随机数(需srand() 初始化) | awk 'BEGIN{srand();print rand()}' (输出随机数) | |
时间函数 | systime() | 生成时间戳(1970-01-01 至今秒数) | awk 'BEGIN{print systime()}' (输出时间戳) |
strftime(fmt[,ts]) | 时间戳转字符串(fmt 为格式符) | awk 'BEGIN{print strftime("%Y-%m-%d %H:%M:%S",systime())}' (输出当前时间) |
(5)格式化输出(printf
)
比print
更灵活,支持自定义格式(如对齐、小数位数),语法:printf "格式符", 变量1, 变量2...
常用格式符:
%s
:字符串;%d
:整数;%f
:浮点数;%%
:百分号。- 对齐控制:
%-10s
(左对齐,占 10 字符);%10d
(右对齐,占 10 字符);%010d
(右对齐,补 0)。
示例:格式化输出员工信息
awk 'BEGIN{printf "%-8s %-6s %-6s %d\n","序号","姓名","部门","年龄"} {printf "%-8s %-6s %-6s %d\n",$1,$2,$3,$4}' employee.txt
3. 输入输出重定向
awk
支持将结果重定向到文件或管道,语法与 Shell 类似:
重定向方式 | 功能 | 示例 | |||
---|---|---|---|---|---|
> | 覆盖写入文件(文件不存在则创建) | awk 'BEGIN{print "hello"} > "test.txt"' (写入test.txt ,覆盖旧内容) | |||
>> | 追加写入文件 | awk 'BEGIN{print "world"} >> "test.txt"' (追加到test.txt 末尾) | |||
` | ` | 管道:将输出传给其他命令 | `awk ‘BEGIN{print “hello world”}’ | tr ‘a-z’ ‘A-Z’`(转为大写) | |
` | &` | 双向管道:读写外部命令 | `awk 'BEGIN{cmd=“tr a-z A-Z”;print “hello” | & cmd; close(cmd,“to”); cmd | & getline out; print out}'( hello转大写输出 HELLO`) |
五、工具对比与适用场景
工具 | 核心优势 | 适用场景 | 不适用场景 |
---|---|---|---|
grep | 快速筛选行,支持正则,轻量高效 | 1. 查找含特定字符 / 模式的行2. 统计匹配行数3. 递归搜索目录文件 | 1. 复杂文本修改(如替换、插入)2. 按列处理数据 |
sed | 非交互式修改文本,支持跨行处理 | 1. 批量替换字符串(全局 / 指定行)2. 删除空行 / 注释行3. 文本插入 / 追加(指定位置) | 1. 复杂数据统计(如字段计算)2. 格式化输出(如对齐、表头) |
awk | 按列处理,支持变量 / 循环 / 数组,擅长分析 | 1. 提取特定字段(如用户名、家目录)2. 数据统计(如人数、平均值)3. 生成结构化报告(带表头 / 表尾) | 1. 快速行过滤(效率低于grep )2. 简单文本替换(语法比sed 复杂) |
协同使用示例:从/etc/passwd
中筛选含/bin/bash
的用户,提取用户名和家目录,按用户名排序并统计数量
grep '/bin/bash' /etc/passwd | awk -F ':' '{print $1,$6}' | sort | awk 'BEGIN{print "用户名 家目录\n--------"} {print $0;count++} END{print "--------\n共"count"个用户"}'