есть ли более чистый способ связать этот конвейер grep без всех обратных косых черт и при этом избежать длинных очередей? - PullRequest
0 голосов
/ 25 апреля 2020

Проблема, с которой я столкнулся, заключается в ее уродливости.

#!/bin/bash

packages=$(\
adb shell ps | \
grep -v root | \
grep -v system | \
grep -v "android.process." | \
grep -v radio | \
grep -v "com.google.process." | \
grep -v "com.lge." | \
grep -v shell | \
grep -v NAME | \
awk '{print $NF}' | \
tr '\r' ' ' )

function nuke(){
    echo "Killing $p"
    adb shell am force-stop  "$1" &
    adb shell am stopservice "$1" &
    adb shell am kill        "$1" &
    adb shell pkill          "$1" &
    adb shell killall -9     "$1" &
}

function nuke-all(){
    for p in $packages; do
        nuke "$p" 
    done
}

nuke-all

Ответы [ 3 ]

4 голосов
/ 25 апреля 2020

Команда OP также может быть выполнена в одной команде, пожалуйста, попробуйте выполнить ее, это одна команда awk (не тестировалась из-за отсутствия заданных образцов и прямого преобразования нескольких команд OP в grep).

adb shell ps | 
awk '
!/root|system|android\.process\.|radio|com\.google\.process\.|com\.lge\.|shell|NAME/{
    gsub(/\r/,OFS)
    print $NF
}'
3 голосов
/ 25 апреля 2020

Вы можете сначала сохранить исключения в массиве:

exceptions=(
   root
   system
   "android.process."
   radio
   "com.google.process."
   "com.lge."
   shell
   NAME
)
grep -vf <(printf "%s\n" ${exceptions[@]}) data

Редактировать: Если вам не нравится, когда строки рассматриваются как обычные извлечения, используйте -Fvf.

2 голосов
/ 25 апреля 2020

Вы можете просто удалить обратную косую черту. Незаконченный конвейер будет продолжен на следующую строку.

packages=$(
    adb shell ps |
        grep -v root |
        grep -v system |
        grep -v "android\.process\." |
        grep -v radio |
        grep -v "com\.google\.process\." |
        grep -v "com\.lge\." |
        grep -v shell |
        grep -v NAME |
        awk '{print $NF}' |
        tr '\r' ' '
    )

Я также добавил отступ, чтобы отразить структуру, и избежал буквальных точек.

Но, как упоминалось в комментариях, это будет Лучше упростить это в одну команду AWK. Или вы можете хотя бы объединить команды grep:

exclude='root|system|android\.process\.|radio|com\.google\.process\.|com.lge\.|shell|NAME'
packages=$(
    adb shell ps |
        grep -vE "$exclude" |
        awk '{print $NF}' |
        tr '\r' ' '
    )
...