我有一个函数,它提供与名为 的文件相关的各种信息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"