如何通过Bash Shell变量向Awk模式传递!~(非匹配)条件
解决Awk排除匹配模式的问题
问题背景
现有文件file.txt内容:
a,b,c,d d,c,b,a
尝试编写的Bash脚本(原脚本存在语法逻辑错误):
#!/bin/bash data=$(cat file.txt) gib () { echo "$1" | awk -v var="$2" 'BEGIN{FS=OFS=","} {if ($1 var~ a) {print $0}}' } ti=$(!) gib "${data}" "$ti"
目标是仅输出第二行:d,c,b,a,核心需求是搞清楚如何在Awk中排除匹配模式,而非包含。
核心解决方案:Awk的不匹配运算符!~
Awk中用!~表示“不匹配正则/字符串”,对应~表示“匹配”。要实现你的需求,有两种简洁写法:
1. 直接处理文件(最推荐)
如果不需要封装函数,直接一行命令就能搞定:
# 排除第一个字段严格等于"a"的行 awk -F',' '$1 != "a"' file.txt # 排除第一个字段包含"a"的行(正则匹配) awk -F',' '$1 !~ /a/' file.txt
Awk是“模式-动作”结构,默认动作是打印整行,所以不需要写if和print,满足模式的行自动输出。
2. 修正你的脚本结构
如果要保留函数封装,修正后的脚本如下:
#!/bin/bash gib () { # 用!~实现不匹配,直接读取传入的内容和模式 awk -v exclude_pattern="$2" -F',' '$1 !~ exclude_pattern' <<< "$1" } # 传入文件内容和要排除的正则模式 gib "$(cat file.txt)" "/a/"
原脚本的错误点
- 变量赋值错误:
ti=$(!)完全不符合需求,这行代码是执行空命令并取其返回值,和“排除匹配”毫无关系。 - Awk语法错误:
$1 var~ a是无效语法,正确的匹配写法是$1 ~ 变量/模式,取反则是$1 !~ 变量/模式。
内容的提问来源于stack exchange,提问作者growler11
相关产品推荐
相关产品推荐

