Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在grep命令中使用从文件读取的行_Linux_Bash_Shell_Scripting - Fatal编程技术网

Linux 如何在grep命令中使用从文件读取的行

Linux 如何在grep命令中使用从文件读取的行,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,首先,我为我糟糕的英语感到抱歉。 我想读取一个文件tel.txt,其中包含许多电话号码,每行一个号码,并使用该行的grep命令来搜索源文件另一个文件中的特定号码 我写了这段代码: dir="/home/mujan/Desktop/data/ADSL_CDR_Text_Parts_A" file="$dir/tel.txt" datafile="$dir/ADSL_CDR_Like_Tct4_From_960501_to_97501_Part0.txt" while IFS= read -r l

首先,我为我糟糕的英语感到抱歉。 我想读取一个文件tel.txt,其中包含许多电话号码,每行一个号码,并使用该行的grep命令来搜索源文件另一个文件中的特定号码

我写了这段代码:

dir="/home/mujan/Desktop/data/ADSL_CDR_Text_Parts_A"
file="$dir/tel.txt"
datafile="$dir/ADSL_CDR_Like_Tct4_From_960501_to_97501_Part0.txt"

while IFS= read -r line
do
    current="$line"
    echo `grep -F $current "$datafile" >> output.txt`
done < $file
但是那代码什么也不返回! 当我用文字声明'current'变量时,它工作正常! 发生什么事了

您的grep命令被重定向到将其输出写入文件,因此您在终端上看不到它

无论如何,您可能应该使用更简单、更快的

grep -Ff "$file" "$datafile"
如果要将输出保存到文件并同时查看,请添加| tee-a output.txt


echo'command'是一种错误且低效的命令编写方法。echo'command'只会效率低下。没有理由将标准输出捕获到字符串中,只是为了将该字符串回显到标准输出。

为什么不直接搜索行变量?我已经做了一些测试,这个脚本在我的linux CentOS 7.x和bash shell上运行:

#!/bin/bash
file="/home/mujan/Desktop/data/ADSL_CDR_Text_Parts_A/tel.txt"

while IFS= read -r line
do
    echo `grep "$line" /home/mujan/Desktop/data/ADSL_CDR_Text_Parts_A/ADSL_CDR_Like_Tct4_From_960501_to_97501_Part0.tx >> output.txt`
done < $file

试试看。。。它在屏幕上不显示任何内容,因为您正在将输出重定向到文件output.txt,因此匹配结果将保存在那里。

使用while loop读取时,应使用文件描述符。使用for loop可避免错误的重定向

dir="/home/mujan/Desktop/data/ADSL_CDR_Text_Parts_A"
file="$dir/tel.txt"
datafile="$dir/ADSL_CDR_Like_Tct4_From_960501_to_97501_Part0.txt"

for line in `cat $file`
do
    current="$line"
    echo `grep -F $current "$datafile" >> output.txt`
done

cat file.txt | grep确保您引用$current。您的输入文件很可能包含DOS回车。如果是,则这是逐行通知的“粘贴到”的副本。然后使用tripleee的溶液。你所需要的只是格雷普,也许还有爱;这保留了原始代码中的许多反模式和低效率。这件事特别令人伤心。我知道,谢谢你指出这一点。我试着让剧本保持原样。。。但是我同意,你的方法更好。如果可以使用grep的-x选项来生成这些完整的行表达式,你也可以使用它。@ghoti是一个很好的补充,尽管从这个问题上看不清楚OP是否只是忘了提到这一点,或者他们是否需要其他东西。
dir="/home/mujan/Desktop/data/ADSL_CDR_Text_Parts_A"
file="$dir/tel.txt"
datafile="$dir/ADSL_CDR_Like_Tct4_From_960501_to_97501_Part0.txt"

for line in `cat $file`
do
    current="$line"
    echo `grep -F $current "$datafile" >> output.txt`
done