Shell脚本-can';无法使用grep在文件中找到字符串

Shell脚本-can';无法使用grep在文件中找到字符串,shell,awk,grep,Shell,Awk,Grep,我遇到了一些我自己解决不了的奇怪问题。我有两个文件,内容如下: File1.txt Butterscotch;lkt+4S7Yhzf/g Sox;WrWMzN6HD Table;K4yPIK+SFfTFs tram;YaY3opP9ie number;e/WwiF5aihUY Buttler;Nsadlkt+4S7Yhz wzahwahwah;PYaY3opP9ieH Butterscotch Sox Table tram number Buttler wzahwahwah Buttler;

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

File1.txt

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

Butterscotch;lkt+4S7Yhzf/g
Sox;WrWMzN6HD
Table;K4yPIK+SFfTFs
tram;YaY3opP9ie
number;e/WwiF5aihUY
Butterscotch
Sox
Table
tram
number
Buttler
wzahwahwah
我需要找出这两个文件之间的差异,但只针对分号之前的条目,因此我首先使用
awk
获取这些条目:

awk 'BEGIN {FS=";"}; {print $1}' File1.txt > Output1.txt
awk 'BEGIN {FS=";"}; {print $1}' File2.txt > Output2.txt
新文件包含以下条目:

Output1.txt

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

Butterscotch;lkt+4S7Yhzf/g
Sox;WrWMzN6HD
Table;K4yPIK+SFfTFs
tram;YaY3opP9ie
number;e/WwiF5aihUY
Butterscotch
Sox
Table
tram
number
Buttler
wzahwahwah
然后我使用
grep-Fxvf Output2.txt Output1.txt>Diff.txt
打印Output2.txt和Output1.txt之间的差异,因此我的文件如下所示:

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

Butterscotch;lkt+4S7Yhzf/g
Sox;WrWMzN6HD
Table;K4yPIK+SFfTFs
tram;YaY3opP9ie
number;e/WwiF5aihUY
Butterscotch
Sox
Table
tram
number
Buttler
wzahwahwah
现在是棘手的部分。我需要从File1.txt中找到以Diff.txt中的条目开头的整行内容并打印到另一个文件中。我声明了一个变量,并执行如下操作:

variable=$(cat Diff.txt)
grep $variable Output1.txt > Delete.txt
所以对于这个例子,我应该得到这样的结果:

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

Butterscotch;lkt+4S7Yhzf/g
Sox;WrWMzN6HD
Table;K4yPIK+SFfTFs
tram;YaY3opP9ie
number;e/WwiF5aihUY
Buttler;Nsadlkt+4S7Yhz
wzahwahwah;PYaY3opP9ieH
Butterscotch
Sox
Table
tram
number
Buttler
wzahwahwah
Buttler;Nsadlkt+4S7Yhz
wzahwahwah;PYaY3opP9ieH
wzahwahwah;PYaY3opP9ieH
但不幸的是,我得到了一个错误:

grep: wzahwahwah: No such file or directory
文件Delete.txt而不是所需的数据包含:

/home/working/File1.txt:Buttler;Nsadlkt+4S7Yhz
所以这远远不是我需要的。我注意到,当我从File1.txt中删除

Butterscotch;lkt+4S7Yhzf/g
Sox;WrWMzN6HD
Table;K4yPIK+SFfTFs
tram;YaY3opP9ie
number;e/WwiF5aihUY
Buttler;Nsadlkt+4S7Yhz
wzahwahwah;PYaY3opP9ieH
Butterscotch
Sox
Table
tram
number
Buttler
wzahwahwah
Buttler;Nsadlkt+4S7Yhz
wzahwahwah;PYaY3opP9ieH
wzahwahwah;PYaY3opP9ieH
我没有收到任何错误,所需的文件如下所示:

Buttler;Nsadlkt+4S7Yhz

你知道为什么这样不行吗?

用这个
grep
代替你的
cat
和随后的
grep

grep -Ff Diff.txt File1.txt
Buttler;Nsadlkt+4S7Yhz
wzahwahwah;PYaY3opP9ieH
当你这么做的时候

variable=$(cat Diff.txt)
grep $variable Output1.txt > Delete.txt
变量展开后,由于它没有引号,grep命令变成

grep Buttler wzahwahwah Output1.txt > Delete.txt

Grep只使用第一个参数作为模式,下面所有的参数都是文件名。Grep在Output1.txt中找到了“Buttler”,但没有找到一个名为“wzahwah”的文件。

我认为问题在于读取变量中的文件内容,然后使用未引用的变量。现在唯一困扰我的是,
Grep
为什么对其他条目有效,但对wzahwah无效;PYaY3opP9ieH。不过,再一次——谢谢。嗨,又是我;)直到今天一切都很顺利。我注意到,例如,当我在Diff.txt中只有一个字母t时,我的Delete.txt文件将包含所有包含该字母的条目(因此将有Butterscotch、tram、Buttler)。是否有办法来保护这个问题,所以grep只能得到整句话?当然可以使用:
grep-wfp Diff.txt File1.txt
此处
-w
进行全词匹配。非常感谢。很好!谢谢你的解释。我已经检查了我上面提到的使用
grep
的所有其他脚本,并且我只在包含一个变量的文件上使用它(例如0或1来检查脚本是否正在运行)。所以我错误地假设这也适用于其他变量:)