2015-11-07 40 views
1

我有一個dumpsys命令的輸出,我想提取兩種模式之間的線,喚醒鎖&換行符。我得到這些線後,我需要一個特定的字符串。喚醒和鎖出現在輸出不止一次,而是喚醒鎖定:大小隻有一次,所以第一個模式可以成爲"Wake*Locks*size"Bash獲取兩種模式之間的線和編輯它們

輸出看起來是這樣的(那裏有上述許多線和低於此)

Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
WAKELOCK 'Term' (uid=35647, pid=362505, ws=null) 
#White space 

我想要「Wake Locks:size = *」和下一個換行符之間的連線,格式是我可以從中提取pid。也許是這樣的:

for i in `dumpsys power | #Some way to get the desired lines#`; do 
Temp=`echo $i | awk '{print $4}'` 
$Temp #Assign var pid = number 
kill -9 $pid 
done 

UPDATE

更新的代碼:

dumpsys power | 
sed -n '/Wake Locks: size=/,/^$/ p' | 
sed -e 's/.*pid=\([0-9]*\).*/\1/' | 
while read pid; do 
    kill -9 ${pid} 
done 
+0

有三個的PID你展示線。你想要哪一個?或者,你想要所有? – John1024

+0

每行有一個pid,所以他們都是 – BonBon

回答

1

當你沒有在第一行,用sed會做一個匹配(你可先檢查第一行)。
首先刪除Wake Locks(以及該行)之前的所有行,繼續刪除剩餘流中第一個空行的所有行,並且在您已經解析的情況下,獲取pid(使用(\\)您會記住字符串,其值與\1一起打印)。

dumpsys power | sed -e '1,/Wake Locks: size=3/ d' \ 
        -e '/^$/,$ d' \ 
        -e 's/.*pid=\([0-9]*\).*/\1/' | while read pid; do 
    echo "You want to kill ${pid}" 
done 

編輯:
對不起,sed的可與-n標誌一起使用:sed -n '/Wake Locks: size=3/,/^$/p'
所以,你可以將代碼重寫到更自然的

dumpsys power | 
    sed -n '/Wake Locks: size=3/,/^$/ p' | 
    sed -e 's/.*pid=\([0-9]*\).*/\1/' | 
    while read pid; do 
     echo "You want to kill ${pid}" 
    done 
+0

這是完美的!感謝你的回答 – BonBon

2

awk來救援!

$ awk '/Wake Locks: size=/{f=1} !NF{f=0} f' file 

會給你

Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
WAKELOCK 'Term' (uid=35647, pid=362505, ws=null) 

,如果你只需要PID值(有三個,其中之一?)你可以試試這個

awk -v FS="[ ,]" 'f{for(i=1;i<=NF;i++) 
         if($i~/pid=/) { 
          sub(/pid=/,"",$i);print $i 
         } 
        } 
/Wake Locks: size=/{f=1} 
       !NF{f=0}' file  
364345 
323345 
362505 

說明:設置標誌f與空白行(NF:字段數= 0)時的模式和未設置。如果設置了標誌,則在字段上迭代,當匹配的模式刪除該模式以離開搜索到的數字時)。將字段分隔符設置爲空格和逗號以從具有默認分隔符的數字中刪除後綴逗號。您可以使用while read pid; do ... done < <(awk ...)中的結果或管道連接到可處理多行輸入的其他腳本。

+0

所以我必須將輸出寫入文件並從那裏繼續,或者在這裏進行管道工作?你也可以爲你的答案添加解釋,供將來參考。 – BonBon

0

如果我明白你希望正確地提取線,也可以實現使用bash內建(參數擴展/子串提取)相同:

#!/bin/bash 

## read from "$1" or stdin 
[ -r "$1" ] && infile="$1" || infile=/dev/stdin 

## check line beginnings for each line 
while read -r line; do 
    [ "${line%%:*}" = "Wake Locks" -o \ 
    "${line%% *}" = "WAKELOCK_NAME" -o \ 
    "${line%% *}" = "ANOTHER_WAKELOCK" -o \ 
    "${line%% *}" = "WAKELOCK_NAME" ] && echo "$line" 
done < "$infile" 

exit 0 

或者用grep可以使用文件包含圖形你想在你的大文件中匹配並致電grep -f matchfile largefile。在這種情況下的matchfile可能看起來像:

grep的模式文件

$ cat dat/wakematch.txt 
^Wake Locks: 
^WAKELOCK_NAME 
^ANOTHER_WAKELOCK 
^WAKELOCK_NAME 

測試輸入

$ cat dat/wake.txt 
junk and more junk 

Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
WAKELOCK 'Term' (uid=35647, pid=362505, ws=null) 
#White space 

junk and more junk 

Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
WAKELOCK 'Term' (uid=35647, pid=362505, ws=null) 
#White space 

使用/輸出 - bash的參數擴展/子串提取

$ bash wakelock.sh dat/wake.txt 
Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 

$ bash wakelock.sh <dat/wake.txt 
Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 

使用grep

$ grep -f dat/wakematch.txt dat/wake.txt 
Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
Wake Locks: size=3 
WAKELOCK_NAME 'Term' (uid=93847, pid=364345, ws=null) 
ANOTHER_WAKELOCK 'Term' (uid=9190247, pid=323345, ws=null) 
0

使用GAWK

gawk '{if($0~/Wake Locks:/){while(!($0~/^\n$/) && getline >=1){print gensub(/.*pid=([0-9]+).*/,"\\1",$0);}}};' 

輸出

364345 
323345 
362505 
相關問題