GAWK 命令 - 2

正则匹配

gawk 默认使用 ERE 模式。

基础用法

首先创建 foo 文本文件。

cat <<EOF > foo
a1,a2,a3
b1,b2,b3
EOF
gawk -F, '/1,a/{ print $1 }' foo
a1

这里是用整行去匹配的,等价于 $0

指定字段匹配

$2 ~ 指定了使用第 2 个字段匹配。

gawk 'BEGIN{ FS="," } $2 ~ /^[ab]2/{ print $2 }' foo
a2
b2

sub

Substitution,替换第一个匹配的字符串。

基本语法

sub(regex, replacement [, target])
  • regex:匹配的正则表达式。
  • replacement:替换匹配的字符串。
  • target:可选,目标字符串,默认 $0

不提供 target,默认是整行匹配。

基础用法

echo "aa bb aa" | gawk '{ sub(/aa/, "cc"); print }'
cc bb aa

指定替换第 3 列。

echo "aa bb aa" | gawk '{ sub(/aa/, "cc", $3); print }'
aa bb cc

特殊符号 &

echo "app cat" | gawk '{ sub(/\w+/, "[&]"); print }'
[app] cat

gsub

Global Substitution,全局替换。

基本语法

gsub(regex, replacement [, target])
  • regex:匹配的正则表达式。
  • replacement:替换匹配的字符串。
  • target:可选,目标字符串,默认 $0

不提供 target,默认是整行匹配。

基础用法

echo 'aa bb aa' | gawk '{ gsub("aa", "cc"); print }'
cc bb cc

指定替换第 3 列。

echo 'aa bb aa' | gawk '{ gsub("aa", "cc", $3); print }'
aa bb cc

特殊符号 &

echo "app cat" | gawk '{ gsub(/\w+/, "[&]"); print }'
[app] [cat]

匹配单词首字符

\< 表示单词的开头。

echo 'app cat' | gawk '{ gsub(/\<[a-z]/, "[&]"); print }'
[a]pp [c]at

匹配单词尾字符

\> 表示单词的结尾。

echo 'app cat' | gawk '{ gsub(/[a-z]\>/, "[&]"); print }'
ap[p] ca[t]

gensub

General Substitution,通用替换。

  • subgsub 强大。
  • 支持捕获组(Capture Groups)。
  • 可选择替换特定匹配项。
  • 不原地修改,返回替换后的字符串。
  • subgsub 不支持捕获组。

基本语法

gensub(regex, replacement, how [, target])
  • regex:匹配的正则表达式。
  • replacement:替换字符串,可用捕获组。
  • how:可指定全局或第 N 次匹配替换。
  • target:可选,目标字符串,默认 $0

基础用法

使用 g 全局替换。

echo "aa aa aa" | gawk '{ print gensub(/aa/, "bb", "g") }'
bb bb bb

替换第 2 个匹配项。

echo "aa aa aa" | gawk '{ print gensub(/aa/, "bb", "2") }'
aa bb aa

使用捕获组

\1 表示第一个匹配参数。

echo "aa-bb" | gawk '{ print gensub(/(\w+)-(\w+)/, "\\2:\\1", "g")}'
bb:aa