使用gawk

时间:2017-07-04 09:36:02

标签: awk gawk

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

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

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

我试图删除行viá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这样的斜杠它不起作用:

  

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

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

我无法通过手动向后移动前进速度,因为我不知道是否会有多少斜线。取决于包含要删除的信息的文件行。

我希望你能帮助我!

1 个答案:

答案 0 :(得分:0)

在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"