Bash 括号内的Awk字符串

Bash 括号内的Awk字符串,bash,awk,Bash,Awk,我正在尝试制作一个脚本,使读取日志更容易。提取括号中的字符串时遇到问题 我想提取日志的线程ID,如下所示: [CURRENT_DATE][THREAD_ID][PROCESS_NAME]Some random text here 我试过了,但它会打印当前日期: awk -F '[][]' '{print $2}' 如果我使用print$3它会在这里打印一些随机文本部分 有没有办法让我读懂括号中的字符串?你可以用这个awk: s='[CURRENT_DATE][THREAD_ID][PROCE

我正在尝试制作一个脚本,使读取日志更容易。提取括号中的字符串时遇到问题

我想提取日志的线程ID,如下所示:

[CURRENT_DATE][THREAD_ID][PROCESS_NAME]Some random text here
我试过了,但它会打印当前日期:

awk -F '[][]' '{print $2}'
如果我使用
print$3
它会在这里打印
一些随机文本
部分


有没有办法让我读懂括号中的字符串?

你可以用这个
awk

s='[CURRENT_DATE][THREAD_ID][PROCESS_NAME]Some random text here'
awk -F '\\]\\[' '{print $2}' <<< "$s"
-F'\]\\['
将文本
][
作为分隔符。

这是怎么回事?(注意,在GNU awk 4中,OP使用的awk版本中似乎没有多个字符分隔符。)

pattern='[CURRENT_DATE][THREAD_ID][PROCESS_NAME]这里有一些随机文本'
回声模式

awk-F'[''{print substr($3,1,length($3)-2)}'不同版本的awk以不同的方式运行。如果不知道您正在运行什么,很难说出现有代码为什么会这样运行

您已经知道,如果字段分隔符为
[][]
或仅为
[
,则每行的开头都有一个空字段。相反,我会尝试以下方法:

awk -F']' '{gsub(/\[/,""); print $2}' input.log

这只需去掉左方括号,并使用它的同伴作为字段分隔符。使用
]
而不是
[
的优点是,它使$1成为您的第一个字段。

嗨,我试过了,它打印了THREAD\u ID]PROCESS\u NAME]这里有一些随机文本。我只是想提取线程IDstring@anubhava奇怪的是,我试图从一个日志文件logs.txt中读取多行相同格式的内容,所以我尝试你的方式是awk-F'\\]\\['{print$2}'path/to/file>tmp.txt,当我打开tmp.txt时,它只是线程ID][PROCESS\u NAME]这里的一些随机文本“注意,您需要双重转义
]
[
。我已经在我的OSX和GNU awk版本上测试了它,并且都使用了
'\\]\\['
,我认为使用GNU awk(多字符分隔符)可能是可行的。”。我也在OSX和GNU awk上进行了测试。不幸的是,我没有可用的常规awk。awk字段分隔符可以是单个字符或正则表达式。顺便说一句,我建议您从帖子中删除bash标记,因为这个问题与bash无关。哪个awk使用
print$3打印一些随机文本ode>?删除了我以前的评论,这一条有效,除了外括号是打印的,所以它看起来像线程ID]我把它改为长度($3)-2,所以它看起来像这个awk-F'[''{打印子($3,1,长度($3)-2)}',它不再打印']'括号了。我这样做对吗?
pattern='[CURRENT_DATE][THREAD_ID][PROCESS_NAME]Some random text here'
echo $pattern

awk -F '[' '{print substr($3, 1, length($3)-2)}' <<< "$pattern"
awk -F']' '{gsub(/\[/,""); print $2}' input.log