匹配多个输出并在单个文件中打印(sed,awk,等等)

时间:2013-12-08 13:37:14

标签: linux sed awk ksh

这类似于我之前的一个问题,但解释起来相当复杂。反正。

有一个文件包含不同的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”我现在并不真正关心标题或任何花哨的东西。

2 个答案:

答案 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等并非如此