行を読み、パターンと一致

行を読み、パターンと一致

私はこれを見つけることができません。ファイルの各行を見て、変数で指定された単語と一致することを確認する必要があります。

commandで始めましたが、readそれ以降は何を使うべきかわかりません。試してみましたが、grep間違って使用している可能性があります。

while read line; do 
  if [ $condition  ] ;then echo "ok" fi
done < file.txt

答え1

簡単な紹介をしたら、私たちがやっていることは次のとおりです。

行1:ファイルを変数として読み込むときline

行2:正規表現と一致し、$line「bird」という単語と一致すると、その行をエコーし​​ます。このifステートメントで必要なすべての操作を実行してください。

行3:whileループが終わってファイルにパイピングfoo.text

#!/bin/bash
while read line; do
  if [[ $line =~ bird ]] ; then echo $line; fi
done <foo.text

「鳥」は正規表現です。このようにして、たとえば、bird.*word同じ行を正規表現に一致させることに置き換えることができます。

次のファイルを使用してfoo.textコンテンツを呼び出します。

my dog is brown
her cat is white
the bird is the word

答え2

より簡単な方法はgrep(またはegrep)を使用することです。

grep bird file.txt

答え3

以下は、2つの引数(ファイル名と変数)を渡す簡単なスクリプトです...以下にハードコードされたバージョンもあります。

#!/bin/bash

[ $# -lt 2 ] && echo "wrong number of args" && exit 1
file=$1
var=$2
while read line; do
    if  echo "$line" | grep -q "$var"; then echo "ok"; fi
done < "$file"
exit 0

[user@myserver ~]$ myscript file.txt some_text

または、ファイル(および変数)を引数として渡すのではなく、ハードコーディングしたい場合...

while read line; do
    if  echo "$line" | grep -q "some_text"; then echo "ok"; fi
done < file.txt

答え4

sed別のオプションは、各行で実行する処理によって異なります。sedただし、すでにすべての行で使用する予定がある場合にのみお勧めします。

sed -n '/regex/p' foo.text

私は-n通常の出力を抑制するためにsedのオプションを使用しています。このコマンドを使用して、p一致する行のみを印刷します。

編集コマンド(処理を意味します)と組み合わせることもできます。

sed -n '/regex/{s/pattern/replacement/;p}' foo.text

各行について何もしたくない場合は同意します。猫スティービーの答えこれがgrep最もクリーンで高速な最高のソリューションです。

grep regex foo.text

追加のUnixコマンドが必要な処理を実行するには(そしてそのような場合にのみ)read

関連情報