加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – “读LINE时”和grep问题

发布时间:2020-12-15 22:21:39 所属栏目:安全 来源:网络整理
导读:我有两个文件. file1.txt: Afghans Africans Alaskans ... 其中file2.txt包含网页上wget的输出,所以这是一个很大的混乱,但确实包含了第一个列表中的许多单词. Bashscript: cat file1.txt | while read LINE; do grep $LINE file2.txt; done 这没有按预期工
我有两个文件.

file1.txt:  
Afghans  
Africans  
Alaskans  
...

其中file2.txt包含网页上wget的输出,所以这是一个很大的混乱,但确实包含了第一个列表中的许多单词.

Bashscript:

cat file1.txt | while read LINE; do grep $LINE file2.txt; done

这没有按预期工作.我想知道为什么,所以我在循环中回显了$LINE变量并添加了一个睡眠1,所以我可以看到发生了什么:

cat file1.txt | while read LINE; do echo $LINE; sleep 1; grep $LINE file2.txt; done

终端中的输出看起来像这样:

Afghans
Africans
Alaskans
Albanians
Americans
grep: Chinese: No such file or directory
: No such file or directory
Arabians
Arabs
Arabs/East Indians
: No such file or directory
Argentinans
Armenians
Asian
Asian Indians
: No such file or directory
file2.txt: Asian Naruto

所以你可以看到它终于找到了“亚洲”这个词.但为什么会说:

No such file or directory

有什么奇怪的事情或我在这里错过了什么吗?

解决方法

@ OP,首先,按照建议使用dos2unix.然后使用awk

awk 'FNR==NR{a[$1];next}{ for(i=1;i<=NF;i++){ if($i in a) {print $i} } } '  file1 file2_wget

注意:在循环中使用while循环和grep效率不高,因为对于每次迭代,都需要在file2上调用grep.

@OP,粗略解释:
有关FNR和NR的含义,请参阅gawk manual. FNR == NR {a [1]; next}表示将file1的内容转换为数组a.当FNR不等于NR(这意味着现在读取第二个文件)时,它将检查文件中的每个单词是否在数组a中.如果是,打印出来. (for循环用于迭代每个单词)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读