Dada uma string para combinar em um arquivo como mostrar a (s) linha (s) específica (s) que não ocorre a uma distância específica da string combinada?

0

O título não agarra muito o corpo. Edições são solicitadas .

Eu tenho uma string android.permission.CAMERA para corresponder na saída de adb shell dumpsys package . Meu objetivo é listar o nome do pacote dos aplicativos que estão usando a permissão android.permission.CAMERA .

Considere este exemplo: Se eu adb shell dumpsys com.google.android.GoogleCamera , obtenho:

Package [com.google.android.GoogleCamera] (cbd5725):
  ...
  applicationInfo=ApplicationInfo{235b16ab com.google.android.GoogleCamera}
  ...
  dataDir=/data/data/com.google.android.GoogleCamera
  ...
  grantedPermissions:
  ...
  ...
  android.permission.CAMERA
  ...

Esse foi um exemplo específico que foi dado porque eu sabia o nome do pacote. No comando original, por exemplo, adb shell dumpsys package , você veria as permissões et al de todos os aplicativos instalados.

O que eu quero fazer é descobrir quais aplicativos declararam a permissão android.permission.CAMERA .

Se você considerar todos os aplicativos variados instalados no sistema, não haverá distância fixa entre:

  • Package [PKG_NAME] (ID): e android.permission.CAMERA
  • applicationInfo=ApplicationInfo{235b16ab PKG_NAME} e android.permission.CAMERA
  • dataDir=/data/data/PKG_NAME e android.permission.CAMERA

o que significa que eu não posso usar grep -Bn na saída.

É definitivamente factível, mas não sei por onde começar.

Concluir o despejo de adb shell dumpsys package : link ou link

É importante, estou usando o Slackware 14.1 no Laptop e o COS12 no meu dispositivo Android com root.

    
por Firelord 10.09.2015 / 03:08

2 respostas

1

awk pode funcionar. Algo como:

awk -v RS='^Package ' '/android\.permission\.CAMERA/ {print $1}'

Isso pressupõe que a linha que começa com Package marca o início da descrição de um novo aplicativo.

Olhando para o conteúdo real, as linhas não começam com Package , mas com Package - recuaram dois espaços. Então, o seguinte deve funcionar:

awk -v RS='\n +Package' '/android\.permission\.CAMERA/{print $1}'

Isso marca uma nova linha seguida por qualquer quantidade de espaços e Package como separador de registro e filtra os registros que contêm android.permission.CAMERA . O primeiro campo é o nome do pacote. E Verifiers: será impresso porque a permissão é listada antes do início das descrições de pacotes.

    
por 10.09.2015 / 03:16
1
perl -nE '/Package \[([^\]]+)/ and $p=$1; /android.permission.CAMERA/ and say $p' datfile

Então, o que isso faz é corresponder a Package [...] lines (salvar o nome do pacote em $p , pois a variável backref $1 será muito prejudicada); se uma linha CAMERA aparecer, emitir o conteúdo de $p . (Isso falhará com uma mensagem de aviso não inicializada se uma linha CAMERA aparecer antes da primeira linha do pacote, o que uma subdefinição principal BEGIN { $p = "dunno" } corrigirá.) Isso também deve ser bastante fácil de ser feito em awk , mas não pense em awk .

(Se os dados de entrada tivessem sido delimitados por uma linha em branco, a iv% perl -00 ( perldoc perlrun ) provavelmente estaria envolvida na minha resposta.)

    
por 10.09.2015 / 03:41