Linux 如何在grep命令中使用从文件读取的行
首先,我为我糟糕的英语感到抱歉。 我想读取一个文件tel.txt,其中包含许多电话号码,每行一个号码,并使用该行的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
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