【问题标题】:Parse interfaces from ifconfig从 ifconfig 解析接口
【发布时间】:2012-09-25 22:05:51
【问题描述】:

我正在尝试以这种形式从命令行获取网络接口列表:

"wlan0","eth0","lo"

我不需要按特殊顺序购买它们。

我可以这样做:

wlan0,eth0,lo

使用这个超级未优化的命令,经过大量搜索并且我认为我已经达到了我的极限:

ifconfig -a | grep -E '' | sed -n 's/^\([^ ]\+\).*/\1/p' | tr -d '\n' | sed s/:/,/g | sed 's/.$//' 

【问题讨论】:

标签: regex sed grep


【解决方案1】:

我会把这个加到一堆。在第一个 sed 中添加引号,然后用 paste 加入行。

ifconfig -a | sed -n 's/^\([^ ]\+\).*/"\1"/p' | paste -sd ","

这比 tr 好,因为没有尾随逗号。

更好的是,因为 ifconfig -a 输出不能真正指望保持一致,请检查 /sys/class/net

ls /sys/class/net | sed -e 's/^\(.*\)$/"\1"/' | paste -sd ","

【讨论】:

  • 有趣,但你还有: 字符
  • 嗯,不是我喜欢的 ifconfig。提问者应该在问题中发布了 ifconfig -a 输出,这似乎因系统而异。真的应该从 /sys/class/net 或 /proc/net/dev 获取这些信息。
  • ls /sys/class/net | sed -e 's/^(.*)$/"\1"/' | paste -sd "," 最后加上 "tr -d '\n'" 就完美了!谢谢!
【解决方案2】:

怎么样:

ifconfig -a | sed -e '/^ /d;/^$/d;s/\([^ ]*\) .*/"\1"/' | tr '\n' ','

我们正在执行三个命令:

  1. /^ /d 此命令检查行是否以空格开头。如果是,“d”将其删除(并转到下一行而不执行剩余的命令)。
  2. /^$/d此命令删除空行
  3. s/\([^ ]*\) .*/"\1"/ 当上述命令失败时会执行此命令(即,现在我们有一行不是空的 并且 不以空格开头)。它所做的是尽可能多地捕获不是空格的字符,然后匹配从空格到行尾的所有字符。替换字符串包含特殊的\1“变量”,其中包含捕获的字符串(即接口名称)。我们还将它包含在引号之间。

在 sed 命令之后,我们有双引号之间的接口,但每行一个。为了解决这个问题,我们使用tr '\n' ',' 将换行符替换为逗号。

希望这会有所帮助 =)

【讨论】:

  • 最后会有一个讨厌的逗号要去掉。
  • 是的,谢谢,它帮助了我很多,所以我想出了这个来摆脱最后的昏迷:ifconfig -a | sed -e '/^ /d;/^$/d;s/([^ ]*) .*/"\1"/' | tr '\n' ',' 但是,使用此命令时,每个逗号前仍有此字符 ':'
【解决方案3】:
ifconfig -a | awk '/^[^[[:space:]]/{a[NR]=$1} END{count=asort(a,b);for(i=1;i<count;i++){printf "\"%s\",", b[i]}; printf "\"%s\"\n", b[count]}'

【讨论】:

    【解决方案4】:

    Perl 在 shell 中:

    ifconfig |
    perl -ane '
        END{print "\042", join("\042,\042", @a), "\042\n"}
        $a[$c++] = $1 if /^(\w+)/; 
    '
    

    如果您使用bash,请尝试以下操作:

    x=( $(ifconfig | grep -o '^[[:alnum:]]\+') )
    
    for ((i=0; i<${#x[@]} -1; i++)); do
        printf '"%s",' ${x[i]}
    done
    
    printf '"%s"\n' ${x[-1]}
    

    基于 Tom McClure,但没有解析 ls :

    printf '"%s"\n' $(
        printf '%s\n' /sys/class/net/* | cut -d '/' -f 5
    ) | paste -sd ","
    

    【讨论】:

      【解决方案5】:

      一种使用GNU find和/sys/class/net/的方式:

      find /sys/class/net/ ! -type d -printf "\"%f\"," | sed 's/,$/\n/'
      

      一种方式解析ifconfig -a:

      ifconfig -a | sed -ne '/^[^ ]/ { s/^\([^ ]\+\).*/"\1"/; H }' -e '$ { g; s/\n//; s/\n/,/g; p }'
      

      【讨论】:

        【解决方案6】:

        如果有的话,最好解析/sys文件系统中的相应节点,但是试试

        ifconfig -a |
        awk '/^[^ ]/ { printf ("%s\"%s\"", s, $1); s="," }'
        

        如果接口名称字段中有尾随冒号,您可以使用awk -F: 来解决此问题。

        【讨论】:

          【解决方案7】:

          如果你只想要一个接口列表,这应该可以:

          echo $(ifconfig | sed -n '/^[[:alnum:]]*:/s/:.*//p')
          

          如果您确实需要项目之间的逗号,那么您可以添加以下管道:

          | sed 's/ /,/g'
          

          如果你真的想要双引号和逗号,那么你可以添加以下管道:

          | sed -e 's/ /","/g' -e 's/.*/"&"/'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-29
            • 2010-11-22
            • 2012-04-16
            • 1970-01-01
            • 2019-08-19
            • 1970-01-01
            • 1970-01-01
            • 2020-12-03
            相关资源
            最近更新 更多