मुझे अपनी परियोजना में सभी लॉग इन करने की आवश्यकता है। मैं इस आदेश का उपयोग कर रहा हूँ कि:

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

यह लाइन लॉगर से युक्त सभी लाइनों को वापस कर देती है। [इनमें से एक कार्टर] परियोजना निर्देशिका "$1" में निहित है सिवाय इसके कि कुछ पंक्तियाँ 2 या 3 पंक्तियों (IDE formating) पर लिखी गई हैं। इस मामले में मुझे केवल पहली पंक्ति मिलती है। मैं उस लॉग का पूरा पाठ प्राप्त करने के लिए क्या कर सकता हूं, यह जानते हुए कि एक लॉग लाइन हमेशा ");" के साथ समाप्त होगी ऐसी रेखा का उदाहरण:

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 / file_name : line_number : लाइन । मुझे यह आदेश मिला जो केवल लाइन लौटाता है, भले ही वह 2 या 3 लाइनों में लिखा हो, लेकिन बिना file_path 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
diego-bf 1 पद 2015, 16:32

2 जवाब

सबसे बढ़िया उत्तर

मुझे अपनी समस्या का हल मिल गया और यहाँ मेरा कोड है:

# 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
diego-bf 8 पद 2015, 10:04

मुझे लगता है कि यह एक ब्रेक लाइन समस्या है। निम्न पंक्तियों द्वारा 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
Hamza Ouarnoughi 1 पद 2015, 16:45