4

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

"wlan0","eth0","lo"

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

我可以做这个:

wlan0,eth0,lo

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

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

7 回答 7

4

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

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 ","
于 2012-10-04T19:53:21.427 回答
3

怎么样:

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

我们正在执行三个命令:

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

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

希望这会有所帮助=)

于 2012-10-04T19:47:03.457 回答
2
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]}'
于 2012-10-04T19:51:09.393 回答
2

Perl外壳中:

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 ","
于 2012-10-04T20:01:56.013 回答
1

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

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

如果接口名称字段有尾随冒号,您可以使用awk -F:.

于 2012-10-04T19:54:37.160 回答
1

GNU find使用and的一种方法/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 }'
于 2012-10-05T01:01:25.277 回答
1

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

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

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

| sed 's/ /,/g'

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

| sed -e 's/ /","/g' -e 's/.*/"&"/'
于 2017-01-02T05:11:21.503 回答