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

时间:2019-02-13 12:59:15

标签: 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 line
do
    current="$line"
    echo `grep -F $current "$datafile" >> output.txt`
done < $file

电话文件示例:

44001547
44001478
55421487

但是该代码什么也不返回! 当我用文字声明“当前”变量时,它可以正常工作! 发生什么事了!!

3 个答案:

答案 0 :(得分:6)

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

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

grep -Ff "$file" "$datafile"

如果要将输出保存到文件中并同时查看,请添加| tee -a output.txt

echo `command`是编写command的错误且效率低下的方式。 (echo "`command`"只是效率低下。)没有理由仅将标准输出捕获为字符串,以便您可以echo将该字符串转换为标准输出。

答案 1 :(得分:0)

为什么不直接搜索 line 变量?我已经做过一些测试,此脚本可在带有bash shell的Linux(CentOS 7.x)上运行:

#!/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,因此匹配的结果保存在此处,因此在屏幕上没有任何显示。

答案 2 :(得分:0)

在使用while循环读取时,应使用文件描述符。而应使用for循环,以避免错误的重定向

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