如何在字符串中使用变量 | grep 命令?

如何在字符串中使用变量 | grep 命令?

我有一个函数,它提供与名为 的文件相关的各种信息CODESFILE-00001.DAT

在函数中,以下命令可以正常工作并返回包含以下内容的行00202200USER

strings CODESFILE-00001.DAT | grep 00202200USER

但是,我想使用一个变量而不是CODESFILE-00001.DAT在整个脚本中插入变量,这样每周当版本.DAT更改时我只需要更改变量而不是脚本中的所有 7 个条目(我知道查找和替换效果很好,但我只想了解是否可以从变量设置文件名)

我已将变量设置为filename=CODESFILE-00001.DAT,然后尝试以下操作但没有成功:

strings $filename | grep 00202200USER 

strings “$filename” | grep 00202200USER

答案1

PATH将其保存在您的目录和chmod +x文件中。

#! /bin/sh -
: "${1?Syntax: $0 <file>}"
strings -- "$1" | grep '00202200USER'

也许创建更复杂的错误检查和/或指定不同模式的选项grep;但从本质上来说,这就是全部了。

$1(和$0,以及选项分隔符)周围的引号--对于稳健性很重要;但它们需要是直的 ASCII 引号 (U+0022),而不是卷曲的“印刷师”引号(问题中的 U+201C、U+201D)。

类似地,在较长的脚本中,您可以设置

filename=${1-CODESFILE-00001.DAT}

指定CODESFILE-00001.DAT为要扫描的文件的默认名称,但允许用户通过向命令行添加参数来覆盖文件名。

如果你想grep在输出中使用多种模式strings,你可以说

strings -- "$filename" |
grep -e '00202200USER' \
     -e '1234SYSTEM' \
     -e '7890REAL'

同时搜索这三个字符串(它们将按照找到的顺序输出),或者如果您想按搜索字符串排序或以其他方式对结果进行后处理,则可以重构为简单的 Awk 脚本。这是一个粗略的草图。

strings -- "$filename" |
awk -v patterns='00202200USER;1234SYSTEM;7890REAL' '
   BEGIN { n=split(patterns, pat, ";") }
   { for(i=1; i<=n; ++i) if ($0 ~ pat[i]) hits[i] = hits[i] "\n\t" $0 }
   END { for(i=1; i<=n; ++i) print pat[i] hits[i] }' 

示例输出:

00202200USER
    ick 00202200USER;1234SYSTEM;7890RE
1234SYSTEM
    ick 00202200USER;1234SYSTEM;7890RE
    foo 1234SYSTEM
7890REAL
    poo 7890REAL
    bah 7890REAL

(如果没有命中某个模式,无论如何都会打印它;如果您不希望这样,修复应该相当明显。)

答案2

它更简单:

#!/bin/sh
filename=CODESFILE-00001.DAT
pattern=00202200USER
grep $pattern $filename

您不需要,strings因为grep可以接受文件名作为最后一个参数(不要害怕使用man grep)。

这里不需要引号,因为您的变量中没有空格。但是,是的,你也可以引用:

grep "$pattern" "$filename"

相关内容