【问题标题】:using literal string for gawk对 gawk 使用文字字符串
【发布时间】:2017-12-07 17:00:31
【问题描述】:

我觉得我已经离问题太近了,我只能自己解决它,尽管我确信它很容易解决。

我正在为我的 Raspberry PI 开发一个带有 SHELL 脚本的 NAS,它会自动收集数据并将其分发到我的其他设备上。所以我决定包含一个删除选项,否则删除一个文件会很痛苦,因为树莓总是会从其他设备复制回来。当脚本运行时,它会创建一个文件:del_tmp_$ip.txt,其中是要从 del_$ip.txt 中删除的目录和文件(不是 del_TMP_$ip.txt)。 它看起来像这样:

test/delete_me.txt
test/hello/hello.txt
pi.txt

我试图通过 awk 删除这些行,这就是我现在的进度:

while read r; do
 gawk -i inplace '!/^'$r'$/' del_$ip.txt
done <del_tmp_$ip.txt

如果 del_tmp_$ip.txt 中的行告诉 gawk 删除 pi.txt,它可以正常工作,但如果字符串包含像 test/delete_me.txt 这样的斜线,它就不起作用:

“意外的换行符或字符串结尾”

然后它指向最后一个斜线。

我无法手动使用反斜杠转义正斜杠,因为我不知道是否会有斜杠以及会有多少斜杠。取决于包含要删除的信息的文件的行。

希望你能帮帮我!

【问题讨论】:

  • 我认为你可以简单地使用grep -Fvxf 'del_tmp_$ip.txt' 'del_$ip.txt'
  • 实际上可行。正如我所说,我试图解决这个问题很长时间,以至于我看不到另一个解决方案。谢谢!

标签: awk gawk


【解决方案1】:

在 awk 评估它之前,永远不要让 shell 变量扩展成为 awk 脚本文本的一部分(这就是你对 '!/^'$r'$/' 所做的事情)并且总是引用你的 shell 变量(所以正确的 shell 语法应该是'!/^'"$r"'$/' 如果这不是错误的方法)。编写该命令的正确语法应该是

awk -v r="$r" '$0 !~ "^"r"$"' file

但你说你想要一个字符串比较,而不是正则表达式,那么它就很简单:

awk -v r="$r" '$0 != r' file

当然你根本不需要 shell 循环:

while read r; do
 gawk -i inplace '!/^'$r'$/' del_$ip.txt
done <del_tmp_$ip.txt

你只需要 1 个 awk 命令:

gawk -i inplace 'NR==FNR{skip[$0];print;next} !($0 in skip)' "del_tmp_$ip.txt" "del_$ip.txt"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多