Bash AWK FS多个分隔符包括修剪前导空格和尾随空格

Bash AWK FS多个分隔符包括修剪前导空格和尾随空格,bash,shell,awk,Bash,Shell,Awk,我想用awk来分割线。和空白,包括切割前导和尾随空白。如果使用-F“[.]”,则不能忽略前导和尾随空格 例如,此命令将获得IPv4,因为默认FS将修剪前导空间: echo " IPv4 Input Packets............................1123330" | awk {print $1}` 但是 echo " IPv4 Input Packets............................112333

我想用awk来分割线。和空白,包括切割前导和尾随空白。如果使用-F“[.]”,则不能忽略前导和尾随空格

例如,此命令将获得IPv4,因为默认FS将修剪前导空间:

echo "              IPv4 Input Packets............................1123330" | awk {print $1}`
但是

echo "              IPv4 Input Packets............................1123330" | awk -F"[. ]" {print $1}
一个也得不到


如何在
awk
中使用
print$1
print$4
获取
IPv4
1123330

您可以在
FS
模式中使用量词
+

s="              IPv4 Input Packets............................1123330"

awk -F '[. ]+' '{print $2, $5}' <<< "$s"

IPv4 1123330
s=“IPv4输入数据包1123330”

awk-F'[.]+'{print$2,$5}'您必须手动去除前导/尾随空格,然后重新分配
$0
以强制再次发生字段拆分:

$ echo "              IPv4 Input Packets............................1123330" |
awk -F'[. ]+' '{sub(/^ +| +$/,""); $0=$0; print $1, $4}'
IPv4 1123330
如果要在剥离中包含所有FS字符:

$ echo "              IPv4 Input Packets............................1123330" |
awk -F'[. ]+' '{sub("^"FS"|"FS"$",""); $0=$0; print $1, $4}'
IPv4 1123330

谢谢你的快速回复。但为什么1美元是空的?有没有一种方法可以让我用$1获得IPv4,用$4获得1123330?我不知道为什么,但这是我们在awk中使用任何非空的
FS
时的行为。即使是
awk-F'[[:blank:][]+'
也会将
$1
保留为空。@vinllen:不清楚您是否意识到可以直接使用
$2
来代替,对吗?祝你好运。
$1
是空的,因为,
$1
是空的。您告诉awk将记录拆分为由空格或句点链分隔的字段。第一个空格或句点序列之前没有任何内容,因此第一个字段为空。在字段拆分过程中,awk唯一一次“特别”处理前导/尾随空格并忽略它们是在FS是
(单个空白字符)的默认值时。是的,我的意思是
的默认
FS
的行为不同。它不仅拆分空格字段,还拆分制表符字段。它使用
-F'[\t]+'
有效地分割字段,并且不会使
$1
为空。然而,当我们在代码中使用
awk-F'[\t]+'
时,它将
$1
留空。