【问题标题】:Shell Script - can't find string in file using grepShell 脚本 - 使用 grep 无法在文件中找到字符串
【发布时间】:2014-10-17 18:38:15
【问题描述】:

我遇到了一些我自己无法解决的奇怪问题。我有两个文件,内容如下:

文件 1.txt

Butterscotch;lkt+4S7Yhzf/g
Sox;WrWMzN6HD
Table;K4yPIK+SFfTFs
tram;YaY3opP9ie
number;e/WwiF5aihUY
Buttler;Nsadlkt+4S7Yhz
wzahwahwah;PYaY3opP9ieH

文件2.txt

Butterscotch;lkt+4S7Yhzf/g
Sox;WrWMzN6HD
Table;K4yPIK+SFfTFs
tram;YaY3opP9ie
number;e/WwiF5aihUY

我需要找出这两个文件之间的差异,但只针对分号之前的条目,所以我首先使用awk 来获取这些条目:

awk 'BEGIN {FS=";"}; {print $1}' File1.txt > Output1.txt
awk 'BEGIN {FS=";"}; {print $1}' File2.txt > Output2.txt

新文件包含以下条目:

Output1.txt

Butterscotch
Sox
Table
tram
number
Buttler
wzahwahwah

Output2.txt

Butterscotch
Sox
Table
tram
number

然后我使用grep -Fxvf Output2.txt Output1.txt > Diff.txt 打印出Output2.txt 和Output1.txt 之间的差异,所以我的文件如下所示:

Diff.txt

Buttler
wzahwahwah

现在是棘手的部分。我需要从 File1.txt 中查找并打印到另一个文件中以 Diff.txt 中的条目开头的整行。我正在声明一个变量并执行以下操作:

variable=$(cat Diff.txt)
grep $variable Output1.txt > Delete.txt

所以对于这个例子,我应该得到这样的东西:

删除.txt

Buttler;Nsadlkt+4S7Yhz
wzahwahwah;PYaY3opP9ieH

但不幸的是我得到一个错误:

grep: wzahwahwah: No such file or directory

文件 Delete.txt 而不是所需的数据包含:

/home/working/File1.txt:Buttler;Nsadlkt+4S7Yhz

所以这远不是我需要得到的。我注意到的是,当我从 File1.txt

中删除
wzahwahwah;PYaY3opP9ieH

我没有收到任何错误,我想要的文件如下所示:

Buttler;Nsadlkt+4S7Yhz

任何想法为什么这不起作用?

【问题讨论】:

    标签: shell awk grep


    【解决方案1】:

    而不是你的cat 和后续的grep 使用这个grep

    grep -Ff Diff.txt File1.txt
    Buttler;Nsadlkt+4S7Yhz
    wzahwahwah;PYaY3opP9ieH
    

    【讨论】:

    • 我认为问题在于读取变量中的文件内容,然后使用未引用的变量。
    • 现在唯一困扰我的是为什么grep 对其他条目有效,但对 wzahwahwah;PYaY3opP9ieH 无效。尽管如此,再次感谢您。
    • 嗨,又是我 ;) 直到今天一切都很好。我注意到,当我的 Diff.txt 中只有一个字母 t 时,我的 Delete.txt 文件会有所有包含该字母的条目(因此会有 Butterscotch、tram、Buttler)。有没有办法确保这一点,所以 grep 只会得到整个单词?
    • 当然可以使用:grep -wFf Diff.txt File1.txt 这里-w 进行全词匹配。
    • 非常感谢。效果很好!
    【解决方案2】:

    当你这样做时

    variable=$(cat Diff.txt)
    grep $variable Output1.txt > Delete.txt
    

    变量展开后,由于不加引号,grep命令变成

    grep Buttler wzahwahwah Output1.txt > Delete.txt
    

    Grep 只使用 first 参数作为模式,所有后面的参数都是文件名。 grep 在 Output1.txt 中找到了“Buttler”,但没有找到名为“wzahwahwah”的文件

    【讨论】:

    • 感谢您的解释。如上所述,我已经检查了我使用grep 的所有其他脚本,并且我只在包含一个变量的文件上使用它(例如,0 或 1 来检查脚本是否正在运行)。所以我错误地假设这也适用于其他变量:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2018-02-27
    • 2013-11-13
    相关资源
    最近更新 更多