如何在字符串中获取模式的字符位置?

时间:2011-12-16 02:05:21

标签: bash

我有一个如下所示的日志:

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的函数,这个函数“返回在haystack字符串中第一次出现针的数字位置”,这正是我需要的,有什么我可以在bash中使用吗?

@shellter ------------------------- 我需要一些非常快的东西,所以我做了很多googleing并找到了一些零碎的东西,然后将它们组合在一起。

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

5 个答案:

答案 0 :(得分:1)

您可以在awk中执行此操作:

VAR=`awk "NR==$i { print \$NF }" log.log`

答案 1 :(得分:1)

从没有任何内容的行开头替换你不想要的所有内容:

  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.log

答案 2 :(得分:1)

如果你的" 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)

答案 3 :(得分:1)

这可能对您有用:

VAR=$(sed 's/.*[0-9]   //' log.log)

答案 4 :(得分:0)

使用cut -f。

cat log.log | while read line; do
  v=$(echo $line | cut -d' ' -f4)
  # do stuff
done