我有一个如下所示的日志:
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
答案 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