2011-12-16 3 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, эта функция «возвращает числовое положение первого появления иглы в строке стога сена», это именно то, что мне нужно, есть ли что-то подобное, что я могу использовать в 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

+0

@shellter Я поставил свой цикл while в редактировании в исходном сообщении – samwell

ответ

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) 
+0

Вау, большое вам спасибо. «xxxxxxxxxxxx» не было никаких пробелов, поэтому я сделал второе предложение и попробовал его. Работал безупречно, большое вам спасибо. – samwell

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 
Смежные вопросы