Awk 如何呈现多个grep,就好像它们在不同的列中一样?

Awk 如何呈现多个grep,就好像它们在不同的列中一样?,awk,grep,format,Awk,Grep,Format,比如说 我有一个文件,上面有计算机名和一些其他信息 例如 计算机1 还有一个文件包含ip地址和一些其他信息 192.168.100.2 例如,我有2个greps: grep-i计算机/etc/hosts grep-ips/etc/hosts 他们给我的答案是 计算机1 19.168.100.2 好的,我想得到一个包含标题和信息的文件,其组织如下: 名称 知识产权 oser1313 19.168.100.1 我假设您的两个文件具有相同的行数,并且一个文件与另一个文件之间的行号匹配:如果oser13

比如说

我有一个文件,上面有计算机名和一些其他信息

例如

计算机1 还有一个文件包含ip地址和一些其他信息

192.168.100.2 例如,我有2个greps:

grep-i计算机/etc/hosts grep-ips/etc/hosts 他们给我的答案是

计算机1 19.168.100.2 好的,我想得到一个包含标题和信息的文件,其组织如下:

名称 知识产权 oser1313 19.168.100.1
我假设您的两个文件具有相同的行数,并且一个文件与另一个文件之间的行号匹配:如果oser1313是/etc/hosts的grep输出中的第n行,那么/etc/hosts中的19.168.100.1也是相同的

因此,它变得非常简单,就像bash脚本一样:

grep -i computer /etc/hosts > part1.dat

grep -i ips /etc/hosts > part2.dat 

echo "Name,IP" > out.dat

paste -d"," part1.dat part2.dat >> out.dat

rm part1.dat part2.dat
或一行,如评论中所建议:

printf "Name,IP\n$(grep -i computer /etc/hosts),$(grep -i ips /etc/hosts)\n" > out.dat

我假设您的两个文件具有相同的行数,并且一个文件与另一个文件之间的行号匹配:如果oser1313是/etc/hosts的grep输出中的第n行,那么/etc/hosts中的19.168.100.1也是相同的

因此,它变得非常简单,就像bash脚本一样:

grep -i computer /etc/hosts > part1.dat

grep -i ips /etc/hosts > part2.dat 

echo "Name,IP" > out.dat

paste -d"," part1.dat part2.dat >> out.dat

rm part1.dat part2.dat
或一行,如评论中所建议:

printf "Name,IP\n$(grep -i computer /etc/hosts),$(grep -i ips /etc/hosts)\n" > out.dat

就这样做吧:

awk '
{ lc = tolower($0) }
lc ~ /computer/ { name = $0 }
lc ~ /ips/ { ip = $0 }
END {
    print "Name", "Ip"
    print name, ip
}
' /etc/hosts

以上内容未经测试,因为您没有提供用于测试的示例输入文件,它只是模拟了您的grep命令的功能,但是如果我们知道您的输入是什么样子的话,可能有更好的方法来完成此操作。

只需执行以下操作:

awk '
{ lc = tolower($0) }
lc ~ /computer/ { name = $0 }
lc ~ /ips/ { ip = $0 }
END {
    print "Name", "Ip"
    print name, ip
}
' /etc/hosts


以上内容未经测试,因为您没有提供用于测试的示例输入文件,并且它只是模拟了您的grep命令的功能,但是如果我们知道您的输入是什么样子的话,可能会有更好的方法来进行测试。

您想要一个脚本来生成作为标记表的输出吗?我最初以为他想要CSVT感谢您添加您的输入在你的问题上努力保持下去。始终建议在您的问题中添加输入和预期输出的样本,以便更好地理解问题,您正在搜索计算机,但您的输出为oser1313,这是该行的特定部分,而不是确切的行,因此如果您不显示样本,我们很难完全理解您的问题,请编辑您的问题,然后让我们知道。是的,很抱歉给您带来任何麻烦。有一个文件的计算机名为纯文本。还有另一个ip地址为的文件。你想要一个脚本来生成作为降价表的输出吗?我最初以为他想要CSV感谢你在问题中添加你的努力保持下去。始终建议在您的问题中添加输入和预期输出的样本,以便更好地理解问题,您正在搜索计算机,但您的输出为oser1313,这是该行的特定部分,而不是确切的行,因此如果您不显示样本,我们很难完全理解您的问题,请编辑您的问题,然后让我们知道。是的,很抱歉给您带来任何麻烦。有一个文件的计算机名为纯文本。还有一个文件的ip地址。为什么要使用这两个额外的文件?您只需使用printf Name、IP\n$grep-i computer/etc/hosts、$grep-i ips/etc/hosts\n>out.dat即可完成您所拥有的功能,因为它对初学者来说更具可读性。尽管如此,我还是编辑添加了你的oneliner;当然,可读性很重要,但有两个额外的文件只意味着它们需要在以后清理。通过将grep的输出分配给两个变量,您可以编写同样可读的内容,而无需清理额外的文件。您是对的。我希望这可以用在脚本中。所以我添加了rm行,应该可以了;很抱歉,我想我现在是在吹毛求疵,但是写入一个文件,即使以后删除它,也会影响性能。执行I/O操作需要时间。如果使用shell的内存,即在变量中存储中间值,而不是写入文件,则速度会快一点。也就是说,它可能只会快几纳秒。为什么要使用这两个额外的文件呢?您只需使用printf Name、IP\n$grep-i computer/etc/hosts、$grep-i ips/etc/hosts\n>out.dat即可完成您所拥有的功能,因为它对初学者来说更具可读性。尽管如此,我还是编辑添加了你的oneliner;当然,可读性很重要,但有两个额外的文件只意味着它们需要在以后清理。通过将grep的输出分配给两个变量,您可以编写同样可读的内容,而无需清理额外的文件。您是对的。我希望这可以用在脚本中。所以我添加了rm行,应该可以了;很抱歉,我想我现在是在吹毛求疵,但是写入一个文件,即使以后删除它,也会影响性能。执行I/O操作需要时间。如果使用shell的内存,即在变量中存储中间值,而不是写入文件,则速度会快一点。也就是说,它可能只会快几纳秒。