【问题标题】:Grep a word out of a file and save the file as that word从文件中提取一个单词并将文件另存为该单词
【发布时间】:2020-06-24 13:56:59
【问题描述】:

我正在使用 Ubuntu Linux 并从文件中提取信息(比如说 filename.log),并希望使用 (filename.log) 中的一些信息来保存文件。

示例:

The info in the (filename.log) has version_name and date.

当使用 cat 在屏幕上显示此信息时,它将显示:

version_name=NAME
date=TODAY

然后我想将该文件另存为 NAME-TODAY.log 并且不知道如何执行此操作。

任何帮助将不胜感激

【问题讨论】:

  • 你已经尝试了什么?
  • 我不知道从哪里开始,因此我们将不胜感激。

标签: linux bash ubuntu scripting grep


【解决方案1】:

您可以使用管道字符| 链接一堆基本的 linux 命令。结合一个叫做命令替换的东西(获取一个复杂命令的输出,在另一个命令中使用。语法:$(your command))你可以实现你想做的事情。

这是我根据您的问题提出的:

cp filename.log $(grep -E "(version_name=)|(date=)" filename.log | cut -f 2 -d = | tr '\n' '-' | rev | cut -c 2- | rev).log

所以我在这里使用了cp$()grepcuttr,最后是rev

既然你说你不知道从哪里开始,让我带你通过这个单线:

  1. cp - 用于复制 filename.log 文件到新文件, 名称基于 version_namedate 的值(第 2 步及以上)
  2. 命令替换 $() 在步骤 1 中完成 cp 命令之前,圆括号之间的整个命令已“解析”。例如在您的示例中,它将是 NAME-TODAY。注意圆括号外末尾的.log,以便为其提供正确的文件扩展名。在您的示例中,此命令的输出将是 NAME-TODAY.log
  3. grep -E "(version_name=)|(date=)" grep 与正则表达式标志 -E 能够做我们正在做的事情。匹配任何包含version_name=date=。预期的输出是:
version_name=NAME
date=TODAY
  1. cut -f 2 -d = 因为我对version_name 不感兴趣 ,但在与该字段关联的值中,我使用 cut 在等于字符 = 处使用标志 -d = 拆分行。然后,我选择带有标志-f 2 的等号字符(第二个字段)后面的值。预期的输出是:
NAME
TODAY
  1. tr '\n' '-' 因为 grep 输出多行,我想删除所有新行并用破折号替换它们。预期输出:
NAME-TODAY-
  1. rev | cut -c 2- | rev 我正在对这些进行分组。 rev 反转了我创建的单词。使用cut -c 2-,我删除了从反转单词的第二个字符开始的所有字符。这是必需的,因为我用破折号替换了新行,这意味着我现在有了NAME-TODAY-。基本上,这只是删除最后一个破折号的额外步骤。查看每个步骤的预期输出:
-YADOT-EMAN
YADOT-EMAN
NAME-TODAY

记住这个值在第 2 步的命令替换中,所以最终的结果是:

cp filename.log NAME-TODAY.log

【讨论】:

    【解决方案2】:

    我设法通过执行以下操作来解决这个问题: grep filename.log > /tmp/file.info && filename=$(echo $(grep "version_name" /tmp/filename.info | cut -d " " -f 3)-$(grep "date" /tmp/filename.info | cut -d " " -f 3)-$filename.log

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2013-01-21
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多