2015-12-01 3 views
0

Мне нужно, чтобы весь журнал был выполнен в моем проекте. Я использую эту команду, чтобы сделать это:строки grep, содержащие определенную строку (строка может быть написана на максимум 3 строки)

grep -rnw $1 -e "Logger.[view]*;$" >> log.txt 

эта строка возвращает все строки, содержащие Logger [один из этих caracters] , содержащиеся в директории проекта «$1» за исключением того, что есть некоторые строки, написанные на. 2 или 3 строки (формирование IDE). В этом случае я получаю только первую строку. Что я могу сделать, чтобы получить полный текст этого журнала, зная, что строка журнала всегда будет заканчиваться «);» пример такой строки:

Logger.v(xxxxxxxxxxxxx 
xxxxxxxxxxxxxxxx); 

Вот мой сценарий:

#!/bin/bash  
echo "Hello Logger! 
# get project path 
echo "project directory is $1" 
# get all project logs and store them into temporary file tmp.txt for processing 
grep -rnw $1 -e "Logger.[view]" >> tmp.txt 
echo "tmp.txt created successfully" 
# remove package name from previous result and store result into log.txt 
sed -r 's/.{52}//' tmp.txt >> log.txt 
echo "log.txt created successfully" 

команда возврата Grep file_path/имя_файла: line_number: линия. Я нашел эту команду, которая возвращает только линию, даже если она написана в 2-х или 3-х линий, но без путь_к_файлуfile_name и line_number

sed -n '/Logger.[viewd]/{:start /;/!{N;b start};/Logger.[viewd]/p}' Main.java 

Есть ли способ, чтобы эти два результата объединены. пример:

/home/xxx/xxx/xxx/Main.java:97:Logger.i(xxxxxxxxxxxxx);  
/home/xxx/xxx/xxx/Main.java:106:Logger.d(yyyyyyyyyyyy 
    yyyyyyyyyyyyyyyyyyyy); 
+0

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

+0

Возможно, посмотрите http://unix.stackexchange.com/questions/112132/how-can-i-grep-patterns-across-multiplelines? –

+0

Вам всегда нужны полные строки, т. Е. Если строка выглядит как 'xxxxxx Logger.v (yyyy', вам тоже нужен xxxxxx? Если нет, ваш вопрос сводится к« найти все строки, соответствующие regexp'/Logger \ . [view] \ (. +? \)/m'. Если ваши файлы не так сильно переопределены, что они не вписываются в память, может быть удобнее (также отлаживать и поддерживать) для использования крошечной программы (Ruby , Perl, Python, ....), slurp файл в строку и запустить regexp в строке. – user1934428

ответ

0

Я нашел решение моей проблемы, и вот мой код:

# get all project logs and store them into log.txt for processing 
for i in $(find -name "*.java") 
do 
echo >> log.txt 
echo "**************** file $i ********************************" >> log.txt 
echo >> log.txt 
    grep -rnw Logger.[viewd] $i | while read -r line ; do 

    # remove breaklines from first line to avoid having bad results 
    line="$(echo $line | sed $'s/\r//')" 

    # if first line ends with ");" print it to log file 
    if [[ ${line: -2} == ");" ]]; then 
     echo $line >> log.txt 

    # else get next line also 
    else 
     # get second line number 
     line_number="$(echo "$line" | cut -d : -f1)" 
     next_line_number=$((line_number+1)) 
     # get second line 
     next_line=$(sed "${next_line_number}q;d" $i | sed -e 's/^[ \t]*//') 
     # concatenate first line & second line 
     line="$line $next_line" 
     # print resulting line to log file 
     echo $line >> log.txt 
    fi 
done 
0

я думаю, что это проблема разрыва строки. Попробуйте заменить grep -rnw $1 -e "Logger.[view]" >> tmp.txt по следующим направлениям:

for i in `ls $1`; 
do 
cat $1/$i | tr '\n' ' ' | grep -rnw -e "Logger.[view]" >> tmp.txt 
done 

Здесь tr '\n' ' ' заменить линию разрыва, с помощью простого пространства.

+0

'$ 1' - это каталог, а не файл поэтому мы не можем выполнить команду cat на нем –

+0

Извините, я думаю, что это был файл журнала.Поэтому я изменю свой ответ! –

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