结合 find + grep + awk 理解 Linux 脚本

问题描述 投票:0回答:1

我有一个这样的脚本:

find . -name '*.nar' | while read NARFILE; do 
  if jar tvf $NARFILE | grep -q jackson-databind; then
    OUTPUT=$(jar tvf $NARFILE | grep jackson-databind)
    echo $NARFILE':'$OUTPUT
  fi
done | 
grep '\-2.9.10.jar' | 
awk -F':' '{print $1}' | while read NARFILE; do
  jar uvf $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar
  jar xvf $NARFILE META-INF/DEPENDENCIES
  sed -i '/jackson-databind/s/2.9.10$/2.9.10.8/' META-INF/DEPENDENCIES
  jar uvf $NARFILE META-INF/DEPENDENCIES
  zip -d $NARFILE  META-INF/bundled-dependencies/jackson-databind-2.9.10.jar 
done

我无法理解这里发生了什么。

到目前为止我的模糊理解:

  1. 查找文件夹中扩展名为.nar的所有文件
  2. 然后我们检查文件内容是否有“jackson-databind”
  3. 如果是,我们创建一些输出(我不确定它的价值是什么)
  4. 然后我们执行 grep 来获取带有“2.9.10.jar”的条目
  5. 然后我们使用 awk 命令用 jackson-databind-2.9.10.8.jar 更新文件

然后我迷路了。

请帮忙。

linux awk jar find
1个回答
0
投票

这没有任何保证,并带有警告,如果您不信任脚本的来源,您可能不应该执行它,即使您认为您完全理解它的作用。有时,一些看似无害的美好事物,在特定情况下可能是有害的。

话虽这么说,从您提供的内容来看,它似乎(双感叹号)它处理 NAR 文件,就像 Apache NiFi 档案中一样,这些文件用于为 NiFi 处理器提供其自己的一组依赖项和库,这些依赖项和库与其余正在运行的内容。脚本所涉及的此类档案中的两个相关文件是 META-INF/DEPENDENCIES

 - 请参阅此 
answer - 以及 META-INF/bundled-dependencies
 目录中的 Jackson Databind jar 文件,其中包含实际将加载和提供的 jar 文件到 NiFi 处理器。

请注意,提到的 Jackson 版本都不是最新版本,并且

29.10.8 至少有三个已知漏洞。 (微)Milestone 2.9.10.8 修复了几个漏洞。探索他们的 github 以获取当前版本和更多信息。

步骤:

find . -name '*.nar' | while read NARFILE; do
查找并浏览所有以 .nar 文件结尾的文件。

if jar tvf $NARFILE | grep -q jackson-databind; then
尝试列出当前 .nar 存档文件的内容,并检查是否提及“jackson-databind”(即它是否包含文件)。 

grep -q

 表示安静,与 
if
 结合使用,则仅当发现某些内容时才会执行以下操作。换句话说,如果 jackson-databind 没有匹配项,那么它基本上不会返回任何内容,并且会转到循环中的下一个 .nar 文件。

OUTPUT=$(jar tvf $NARFILE | grep jackson-databind) echo $NARFILE':'$OUTPUT fi done |
将匹配项存储在 OUTPUT 中,然后将当前 .nar 文件与此行一起回显并进一步通过管道传输。本质上,这意味着到目前为止,它会遍历所有 .nar 文件,查看内部,如果找到 jackson-databind,则它将 .nar 文件名与 jackson-databind 的行“捆绑”在一起,并将其提供给下一步中的下一步。如果您愿意,可以使用键值对。

grep '\-2.9.10.jar' | awk -F':' '{print $1}' | while read NARFILE; do
首先它会准过滤 2.9.10.jar,以便匹配包含另一个版本的 jackson-databind 的行,不会执行任何操作。 

awk -F':'

 然后再次拆开我所说的 .nar 文件的“键值对”并再次行,并为下一步提供 .nar 文件名。

jar uvf $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar
这会使用相对文件路径

META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar

更新.nar存档。因此,这是一个假设位于您的文件系统中的文件,相对于您执行此脚本的位置。

jar xvf $NARFILE META-INF/DEPENDENCIES sed -i '/jackson-databind/s/2.9.10$/2.9.10.8/' META-INF/DEPENDENCIES jar uvf $NARFILE META-INF/DEPENDENCIES
提取、编辑、然后使用 *.nar 文件中的 META-INF/DEPENDENCIES 文件的编辑更新存档。编辑:在包含“jackson-databind”的行中,将字符串“2.9.10”交换为“2.9.10.8”,这就是 sed -i (就地编辑)所做的。

zip -d $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.jar
从存档中删除旧的 jackson-databind-2.9.10.jar。

简而言之,似乎要做的就是将 NAR 档案中的 Jackson Databind 版本从旧版本更新为较新的旧版本。

© www.soinside.com 2019 - 2024. All rights reserved.