

以下のような２つのファイルtest1.txt（スペース区切り）, test2.txtがあり、  
test2.txtの文字列が含まれるtest1.txtの行を抽出したファイル（test3.txt）を生成するためのシェルスクリプトのコードをご教示いただくことはできないでしょうか。

■test1.txt  
AAA a b  
BBB b c  
CCC c d  
DDD d e  
EEE e f

■test2.txt  
AAA  
CCC  
EEE

■test3.txt  
AAA a b  
CCC c d  
EEE e f


CC BY-SA 4.0
2019-01-13T15:28:52.057
51953
2019-01-13T16:35:10.387
31783
question
grep
シェルスクリプト上でファイルに含まれる行を抽出


環境がLinux（GNU coreutils）であれば、joinコマンドが使えます。SQLの内部結合に相当します。

[code]

    $ join test1.txt test2.txt
    AAA a b
    CCC c d
    EEE e f
    
[/code]


CC BY-SA 4.0
2019-01-13T16:09:28.503
51954
2019-01-13T16:09:28.503
4010
51953
answer


標準入力へリダイレクトを用いて，

[code]

    #!/bin/bash
    
    while read line
    do
            grep $line ./test1.txt >> ./test3.txt
    done < ./test2.txt
    
[/code]

というのはどうでしょうか．


CC BY-SA 4.0
2019-01-13T16:11:30.883
51955
2019-01-13T16:11:30.883
31767
51953
answer


grep の `-f` (`--file=FILE`) オプションを利用するのが良さそうです。

> -f FILE, --file=FILE パターンを FILE から 1 行 1 パターンとして読み込みます。 このオプションを複数回使ったときや、
> -e (--regexp) オプションと組み合わせたときは、与えられたすべてのパターンを検索します。  
>  空のファイルはパターンを含まないので、何にもマッチしません。

<https://linuxjm.osdn.jp/html/GNU_grep/man1/grep.1.html>

実行例：

[code]

    $ grep -f test2.txt test1.txt > test3.txt
    $ cat test3.txt
    AAA a b
    CCC c d
    EEE e f
    
[/code]


CC BY-SA 4.0
2019-01-13T16:35:10.387
51956
2019-01-13T16:35:10.387
2391
51953
answer