我正在读取一个文本文件来提取一些特定的信息。我可以使用一个简单的管道来解决这个问题,比如:
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+字符作为字段。