我正在尝试从一个文件中grep ip地址,并使用一个命令从第二个文件中删除grep的内容。
主文件有
header x.x.x.x
header x.x.x.x
header2 y.y.y.y
header2 y.y.y.y
header3 z.z.z.z
header3 z.z.z.z
临时文件有
x.x.x.x
x.x.x.x
y.y.y.y
y.y.y.y
z.z.z.z
z.z.z.z
尝试
grep "header" masterfile | sed 's/^.* //' | sed -i "" '/$/d' tempfile
在sed命令删除条目后,还要删除空行。
答案 0 :(得分:3)
如果我理解正确,您需要以下内容:
grep -v -F -f <(grep '\<header\>' masterfile | cut -d' ' -f2) tempfile
或
grep -v -F -f <(sed 's/^header *//' masterfile) tempfile
为了您的输入,它会产生:
y.y.y.y
y.y.y.y
z.z.z.z
z.z.z.z
为了将更改保存到tempfile
,您可以将命令输出重定向到另一个文件并将其移动到所需的文件:
grep -v -F -f <(sed 's/^header *//' masterfile) tempfile > tmp && mv tmp tempfile
编辑:您似乎是sh
,它不支持进程替换。在这种情况下,您可以使用以下内容:
grep '\<header\>' master | cut -d' ' -f2 | grep -v -F -f - tempfile
答案 1 :(得分:2)
从第一个文件生成sed
脚本,并将其提供给第二个sed
实例。
sed 's%^header \(.*\)%/^\1\$/d%' masterfile |
sed -i "" -f - tempfile
在Linux上,-f -
表示从标准输入读取脚本。在其他一些平台上,这不起作用;然后,您必须将脚本保存到临时文件中(或者您可能有/dev/fd/1
或/dev/stdin
)。