这类似于我之前的一个问题,但解释起来相当复杂。反正。
有一个文件包含不同的MAC地址和所述设备的2位数标识符。我目前正在使用类似的东西从该文件中获取信息:
grep XX|cut -c45-56
#XX是我上面提到的2位数字模式。
所以上面变成了:
grep XX|cut -c45-56 >> /tmp/file
grep : /proc/net/arp|sed 's|:||g' | grep file
现在XX(2位数字标识符)就在我正在进行的线路上的字段45之前,以获得MAC地址(参见第一行)。
所以我希望最终输出类似于::
XX MACADDRESS IPADDRESS
所有这些目前都是从文件中删除的,我应该在for循环中执行此操作并将输出转换为变量吗?如果是这样,我将如何继续打印awk
的那些?
非常感谢任何类型的明确例子。
感谢。
编辑:这是第一个文件的示例
> grep XX samplefile
0:0123:48: :3:/dev/ttyXX :8: :4P:XX:99:MACADDRRESSX
:12222222:1322:46:XX1@231212:
对于第一个grep之后的输出文件,它只是一个MAC地址列表。最后的输出,它只是几行“XX MACADDRESS IP ADDRESS”我现在并不真正关心标题或任何花哨的东西。
答案 0 :(得分:0)
您可以尝试类似
的内容awk -vpat="XX" -f p.awk samplefile
其中p.awk
是
BEGIN {
while((getline < "/proc/net/arp")>0) {
if (/:/) {
gsub(/:/,"",$4)
a[$4]=$1
}
}
}
$0 ~ pat {
mac=substr($0,45,12)
if (mac in a)
print pat,mac,a[mac]
}
为避免使用getline
,您可以尝试:
awk -vpat="XX" -f p2.awk /proc/net/arp samplefile
其中p2.awk
是
FNR==NR {
if (/:/) {
gsub(/:/,"",$4)
a[$4]=$1
}
next
}
$0 ~ pat {
mac=substr($0,45,12)
if (mac in a)
print pat,a[mac],mac
}
答案 1 :(得分:0)
为什么不使用python,ruby或任何其他更完整的语言? Python可能已经安装好了,你不需要学习任何特殊的魔法来使它工作。
它可能会更长一点,但您获得灵活性,可测试性,您将能够轻松地重用部分代码等。
例如,您可以使用ruby:
def find_ip_in_arp(mac)
# insert a colon every two digits, the output has the mac address with colons
mac = mac.scan(/../).join(":") unless mac.include? ":"
File.foreach("/proc/net/arp").grep(mac) do |line|
return line.split.first # the IP
end
end
def find_mac_in_stream(ident, stream)
stream.lines.grep(/^.{38}#{ident}.{4}(?<mac>.{12})/) do |line|
return Regexp.last_match(:mac)
end
end
def run
to_match = ARGV.shift
if mac = find_mac_in_stream(to_match, ARGF)
if ip = find_ip_in_arp(mac)
puts "#{to_match} #{mac} #{ip}"
exit 0
end
end
exit 1
end
run if $0 == __FILE__
因此您可以将其作为cat somefile | ruby thisscript.rb XX
运行,或将文件作为arg运行:ruby thisscript.rb XX somefile
。
你可以通过使用更多魔法或更长时间,在任何步骤中更明确地缩短它。你必须在这个世界上拥有所有的自由。 AWK等并非如此