对不起,我的英语不好。 我想读取一个包含许多电话号码(每行一个号码)的文件(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
但是该代码什么也不返回! 当我用文字声明“当前”变量时,它可以正常工作! 发生什么事了!!
答案 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