我正在尝试以这种形式从命令行获取网络接口列表:
"wlan0","eth0","lo"
我不需要按特殊顺序购买它们。
我可以做这个:
wlan0,eth0,lo
使用这个超级非优化命令,经过大量搜索并且我认为我已经达到了我的极限:
ifconfig -a | grep -E '' | sed -n 's/^\([^ ]\+\).*/\1/p' | tr -d '\n' | sed s/:/,/g | sed 's/.$//'
我会把这个加到一堆。在第一个 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 ","
怎么样:
ifconfig -a | sed -e '/^ /d;/^$/d;s/\([^ ]*\) .*/"\1"/' | tr '\n' ','
我们正在执行三个命令:
/^ /d
此命令检查行是否以空格开头。如果是,“d”将其删除(并转到下一行而不执行剩余的命令)。/^$/d
此命令删除空行s/\([^ ]*\) .*/"\1"/
当上述命令失败时(即,现在我们有一行不为空且不以空格开头)时会执行此命令。它所做的是尽可能多地捕获不是空格的字符,然后匹配从空格到行尾的所有字符。替换字符串包含特殊的\1
“变量”,其中包含捕获的字符串(即接口名称)。我们还将它包含在引号之间。在 sed 命令之后,我们有双引号之间的接口,但每行一个。为了解决这个问题,我们使用tr '\n' ','
逗号替换换行符。
希望这会有所帮助=)
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]}'
在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 ","
如果有,最好解析文件系统中的相应节点/sys
,但请尝试
ifconfig -a |
awk '/^[^ ]/ { printf ("%s\"%s\"", s, $1); s="," }'
如果接口名称字段有尾随冒号,您可以使用awk -F:
.
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 }'
如果您只想要一个接口列表,这应该可以工作:
echo $(ifconfig | sed -n '/^[[:alnum:]]*:/s/:.*//p')
如果您确实需要项目之间的逗号,那么您可以添加以下管道:
| sed 's/ /,/g'
如果你真的想要双引号和逗号,那么你可以添加以下管道:
| sed -e 's/ /","/g' -e 's/.*/"&"/'