从shell脚本上的文本中提取特定的值



我正在读取一个文本文件来提取一些特定的信息。我可以使用一个简单的管道来解决这个问题,比如:

line='[any] a b "c a" valuewanted k o'
echo $line | cut -d " " -f 6 | sort -u
# prints valuewanted

但是我正在检查所有日志文本,我看到另一个空格的值正在破坏我的管道。为例:

line='[any] a "b 1" "c a" valuewanted k o'
echo $line | cut -d " " -f 6 | sort -u
#prints a"
# must change -f to -f 7

我也试过使用aws '{print $6}',但发生同样的错误。

我正在读取一个大文件,所以每一行都改变位置是不可行的。每条线都有一个图案,每一组都被一个空格隔开。如果内容在双引号之间,它与同一组相关,而不是像我在脚本中解析的不同组。

当一个组有空格时,整个组的值都在双引号周围。

是否有办法使命令cut按空格分割,并将"content whatever"作为单个组处理?

您可以使用gnu-awk与FPAT:

awk -v FPAT='"[^"]*"|[^[:blank:]]+' -v OFS='|' '
{print $1,$2,$3,$4,$5,$6,$7}' file
[any]|a|b|"c a"|valuewanted|k|o
[any]|a|"b 1"|"c a"|valuewanted|k|o
# input data
cat file
[any] a b "c a" valuewanted k o
[any] a "b 1" "c a" valuewanted k o

我使用print $1,$2,$3,$4,$5,$6,$7来演示所有字段值。你可以把它改成任何你喜欢的。

您可以在两行的第三个字段中使用b"b 1"

请注意,"[^"]*"|[^[:blank:]]+是一个正则表达式模式,它使用交替匹配双引号字符串,否则匹配非空白字符的1+字符作为字段。

相关内容

  • 没有找到相关文章