标题并没有太多抓住身体。要求修改。
我有一个android.permission.CAMERA
要在 的输出中匹配的字符串adb shell dumpsys package
。我的目标是列出正在使用该权限的应用程序的包名称android.permission.CAMERA
。
考虑这个例子:如果我这样做,adb shell dumpsys com.google.android.GoogleCamera
我会得到:
软件包 [com.google.android.GoogleCamera] (cbd5725): ... applicationInfo=ApplicationInfo{235b16ab com.google.android.GoogleCamera} ... dataDir=/data/data/com.google.android.GoogleCamera ... 授予权限: ... ... android.permission.CAMERA ...
这是一个具体的例子,因为我知道包名称。在原始命令中,adb shell dumpsys package
您将看到权限等人,在所有已安装的应用程序中。
我想做的是找出哪些应用程序已经声明了权限android.permission.CAMERA
。
如果您考虑系统中安装的所有不同应用程序,那么以下之间没有固定的距离:
Package [PKG_NAME] (ID):
和android.permission.CAMERA
applicationInfo=ApplicationInfo{235b16ab PKG_NAME}
和android.permission.CAMERA
dataDir=/data/data/PKG_NAME
和android.permission.CAMERA
这意味着我至少不能grep -Bn
在输出上使用。
这绝对是可行的,但我不知道从哪里开始。
完整转储adb shell dumpsys package
:http://pasted.co/e0cd2d4d或者https://paste.ee/p/ylpax
重要的是,我在笔记本电脑上使用 Slackware 14.1,在已 root 的 Android 设备上使用 COS12。
答案1
awk
可能会起作用。就像是:
awk -v RS='^Package ' '/android\.permission\.CAMERA/ {print $1}'
这假设以 开头的行标记Package
新应用程序描述的开始。
查看实际内容,行不是以 开头Package
,而是以Package
- 缩进两个空格。所以以下应该有效:
awk -v RS='\n +Package' '/android\.permission\.CAMERA/{print $1}'
这将标记一个换行符,后跟任意数量的空格并Package
作为记录分隔符,并过滤掉那些包含android.permission.CAMERA
.第一个字段是包名称。并将Verifiers:
被打印,因为权限在包描述开始之前列出。
答案2
perl -nE '/Package \[([^\]]+)/ and $p=$1; /android.permission.CAMERA/ and say $p' datfile
所以它的作用是匹配行Package [...]
(将包名称保存为$p
backref 变量$1
将被破坏很多);如果CAMERA
出现一行,则发出 的内容$p
。 (如果CAMERA
在第一个包行之前出现一行,这将失败,并显示未初始化的警告消息,BEGIN { $p = "dunno" }
前导子定义将更正该行。)这在 中也应该很容易做到awk
,但我不认为在awk
.
(如果输入数据由空行分隔,那么我的答案中可能会涉及perl -00
( ) 调用。)perldoc perlrun