给定文件中要匹配的字符串,如何输出与匹配字符串的特定距离处不出现的特定行?

给定文件中要匹配的字符串,如何输出与匹配字符串的特定距离处不出现的特定行?

标题并没有太多抓住身体。要求修改


我有一个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_NAMEandroid.permission.CAMERA

这意味着我至少不能grep -Bn在输出上使用。

这绝对是可行的,但我不知道从哪里开始。

完整转储adb shell dumpsys packagehttp://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 [...](将包名称保存为$pbackref 变量$1将被破坏很多);如果CAMERA出现一行,则发出 的内容$p。 (如果CAMERA在第一个包行之前出现一行,这将失败,并显示未初始化的警告消息,BEGIN { $p = "dunno" }前导子定义将更正该行。)这在 中也应该很容易做到awk,但我不认为在awk.

(如果输入数据由空行分隔,那么我的答案中可能会涉及perl -00( ) 调用。)perldoc perlrun

相关内容