我使用的是UbuntuLinux,正在从文件(比如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命令。结合一种叫做命令替换的东西(获取一个复杂命令的输出,用于另一个命令。语法:$(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
,$()
,grep
,cut
,tr
,最后是rev
。
既然你说你不知道从哪里开始,让我带你走过这句话:
cp
-用于将filename.log文件复制到新文件中,名称基于version_name
和date
的值(步骤2及以上(- 命令替换
$()
在完成步骤1中的cp命令之前,圆括号之间的整个命令被"解析"。例如,在您的示例中,它将是NAME-TODAY。注意圆括号外末尾的.log
,为其提供适当的文件扩展名。在您的示例中,此命令的输出将是NAME-TODAY.log
grep -E "(version_name=)|(date=)"
grep带有regexp标志-E
,可以做我们正在做的事情。匹配任何包含version_name=
或date=
的行。预期输出为:
version_name=NAME
date=TODAY
cut -f 2 -d =
,因为我对version_name
不感兴趣,但在与该字段相关联的值中,我使用cut来分割具有标志-d =
的等于字符=
处的行。然后,我选择带有标志-f 2
的等于字符(第二个字段(后面的值。预期输出为:
NAME
TODAY
tr 'n' '-'
因为grep在多行上输出,所以我想删除所有新行并用短划线替换它们。预期输出:
NAME-TODAY-
rev | cut -c 2- | rev
我正在对这些进行分组。rev
反转了我创建的单词。使用CCD_ 27,我剪切掉从反转字的第二个字符开始的所有字符。这是必需的,因为我用短划线替换了新行,这意味着我现在有了NAME-TODAY-
。基本上,这只是删除最后一个破折号的额外步骤。请参阅每个步骤的预期输出:
-YADOT-EMAN
YADOT-EMAN
NAME-TODAY
记住这个值在步骤2的命令替换中,所以最终结果是:
cp filename.log NAME-TODAY.log
我通过执行以下操作解决了这个问题:grep filename.log>/tmp/file.info&;filename=$(echo$(grep"版本名称"/tmp/filenname.info|cut-d"-f 3(-$(grep"日期"/tmp-filenname.info | cut-d"-f 3(-$filename.log