我有一个日志,看起来像这样:
2011-12-15 23:37 8920 xxxxxxxxxxxx
2011-12-16 00:06 8979 xxxxxxxxxxxx
2011-12-16 00:40 8757 xxxxxxxxxxxx
2011-12-16 00:43 8795 xxxxxxxxxxxx
2011-12-16 00:43 8795 xxxxxxxxxxxx
2011-12-16 01:17 174050 xxxxxxxxxxxx
2011-12-16 01:19 139883 xxxxxxxxxxxx
2011-12-16 01:34 174129 xxxxxxxxxxxx我需要解析这个日志,但我唯一关心的部分是"xxxxxxxxxxxx";"xxxxxxxxxxxx“可以是任何东西,但它总是具有相同的字符数。
目前,我正在使用它来解析我的日志:
VAR=`awk NR==$i log.log | cut -c30-45`但这是假设第三列不会更改字符数,例如"8920",但如您所见,有三个日志超过四个字符,例如"174129“。除了第三列之外的所有内容都将具有相同的字符数,第四列将有所不同,但字符数将不同。
我需要得到第四列中的内容,所以我想也许我可以得到"xxxxxxxxxxxx“开始的字符位置,然后我就可以做cut -c$STRING_POS-67了。在PHP中有一个叫做strpos的函数,这个函数“返回大堆字符串中第一次出现的指针的数字位置”,这正是我需要的,有没有类似这样的东西可以在bash中使用呢?
@shellter -我需要一些非常快速的东西,所以我做了很多谷歌搜索,找到了一些零碎的东西,然后把它们组合在一起。
NUM_LINES=`awk -F, 'END{print NR}' log.log`
while [ $i -le $NUM_LINES ]
do
VAR=`awk -v a=$i 'NR==a{print $4}' log.log | cut -c28-58`
# Do stuff with $VAR
i=$(( $i + 1 ))
done发布于 2011-12-16 11:21:55
如果你的"xxxxxxxxxxxx“数据中没有空格,那么下面的代码应该是有效的-
VAR=$(awk -v a=$i 'NR==a{print $NF}' log.log)或
VAR=$(awk -v a=$i 'NR==a{print $4}' log.log)如果"xxxxxxxxxxxx“可能有一个空格,那么上面的方法就不起作用了。
在这种情况下,您可以执行以下操作-
VAR=$(awk -v a=$i 'NR==a{$1="";$2="";$3="";print $0}' log.log)发布于 2011-12-16 10:11:43
您可以在awk中正确执行此操作
VAR=`awk "NR==$i { print \$NF }" log.log`发布于 2011-12-16 10:18:33
从行首开始将所有不需要的内容替换为nothing:
sed -e 's/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] *[0-9][0-9]* *//' log.loghttps://stackoverflow.com/questions/8529003
复制相似问题