2012-04-13 3 views
0

Мне нужна помощь в обработке строк в скрипте CSH/TCSH. Я знаю основную обработку, но мне нужна помощь, чтобы понять, как мы можем обрабатывать требования к работе с строкой.Операция выборочной строки

У меня есть файл журнала, формат которого является чем-то вроде этого:

[START_A]

журнал Информация о A

[END_A]

[START_B]

информация о журнале B

[END_B]

[START_C]

журнал Информация о C

[END_C]

Мое требование, чтобы выборочно извлекать содержимое между начальным и конечным тегом и хранить их в файле , , например, содержание между START_A и END_A будут храниться в A.log

ответ

0

Awk может сделать их 1 на время:

cat log | awk '/[START_A]/,/[END_A]/' 
+0

Спасибо, это сработало. Мне нравится ваш ответ, поскольку он очень прост для понимания. – Ani

+0

[UUoC] (http://partmaps.org/era/unix/award.html#uucaletter) –

+0

Возможно, вы можете сделать это со всеми параметрами сразу, используя регулярное выражение, а не только статические строки. – John3136

1

это должно работать для вас:

awk -F'_' '/\[START_.\]/{s=1;gsub(/]/,"",$2);f=$2".txt";next;}/\[END_.\]/{s=0} s{print $0 > f}' yourLog 

испытания:

kent$ cat test 
    [START_A] 

    log info of A 

    [END_A] 

    [START_B] 

    log info of B 

    [END_B] 

    [START_C] 

    log info of C 

    [END_C] 


kent$ awk -F'_' '/\[START_.\]/{s=1;gsub(/]/,"",$2);f=$2".txt";next;}/\[END_.\]/{s=0} s{print $0 > f}' test 

kent$ head *.txt 
==> A.txt <== 

    log info of A 


==> B.txt <== 

    log info of B 


==> C.txt <== 

    log info of C 
+0

hey kent, я попробовал запустить ваш пример и работал без каких-либо ошибок, но не смог сгенерировать требуемые файлы. Это могло быть лучшим решением, так как я буду использовать одну строку команды вместо нескольких команд. Не могли бы вы немного объяснить, как работает команда. Я знаю базовый awk и буду разбирать концепцию с некоторым объяснением. Спасибо! – Ani

+0

Это работает только для односимвольных тегов и для однострочных записей журнала, но его можно легко изменить, чтобы быть более общим. +1 в любом случае. –

0

Это может сработать для вас:

sed '/.*\[START_\([^]]*\)\].*/s||/\\[START_\1\\]/,/\\[END_\1\\]/w \1.log|p;d' file | 
sed -nf - file 
+0

Не работает для меня. Можете ли вы объяснить небольшую концепцию, стоящую за вашей командой. Я надеюсь узнать, что вы пытаетесь сделать, и, надеюсь, увидеть, что я делаю что-то неправильно. Thanks – Ani

+0

Первая часть создает скрипт 'sed', который записывает части' файла' между разделителями начала и конца в файл журнала на основе разделителя начала. Вторая часть (после трубы) считывает сгенерированный скрипт sed и запускает его в «файл». Вы можете отправить первую часть файла файла '>.sed', а затем запустить его против файла следующим образом: 'sed -fn file.sed file'. – potong

Смежные вопросы