2011-12-16 107 views
0

我有一個日誌,看起來像這樣:如何獲取字符串中模式的字符位置?

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

你是否正在執行VAR =`...`在一個while循環中讀取整個日誌文件,該文件基本上處理整個文件?如果是這樣,或許更好地弄清楚如何在1 awk進程中完全解析文件。其他...沒關係! ;-) 祝你好運。 – shellter 2011-12-16 02:59:46

+0

@shellter我已將我的while循環放在原帖 – samwell 2011-12-16 08:27:47

回答

1

如果你的 「XXXXXXXXXXXX」 數據在它沒有空格,那麼下面應該應該工作 -

VAR=$(awk -v a=$i 'NR==a{print $NF}' log.log) 

OR

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) 
1

可以在awk做是正確的:

VAR=`awk "NR==$i { print \$NF }" log.log` 
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 
1

這可能會爲你工作:

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

使用剪切-f。

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