行に文字列が含まれている場合はgrepする方法は?

行に文字列が含まれている場合はgrepする方法は?

という設定ファイルがあります。学生

grade1 class1 11 student
grade1 class1 12 student
grade2 class1 21 student
grade2 class2 22 student
......

今私はテストファイルファイルを読む学生です。グレード名とグレードを入力すると、2つの文字列を含む行がコピーされます。学生のコピー。コードは以下のように表示されます。

echo Input gradename and studentnumber
read gradename
read studentnumber

if (input gradename and studnetnumber);
then
    echo "the line include them" >> student_copy

たとえば、

if (input grade1 and 11);
then 
    echo grade1 class1 11 student >> student_copy

答え1

grep論理的ではないそしてタスク(例えばmatch patternA AND patternB)に最も近いタスクは、可能なバリアント(たとえばgrep -E 'patternA.*patternB|patternB.*patternA')に一致するように長い正規表現を設定することです。一致するパターンが多いと、非常に不器用で扱いにくくなることがあります。

必要なものを達成する最も簡単な方法は、代わりにスクリプト言語(awkまたは)をperl使用することですgrep

たとえば、次の行awkは、両方のパターンが発生するすべての行と一致します。

awk '/patternA/ && /patternB/'

たとえば、パターンAは含まれているがパターンBは含まれていない行を一致させたい場合は、すべてのパターン一致を元に戻すことができます。まさかタスク):

awk '/patternA/ && ! /patternB/'

注:簡単な方法はgrep patternA | grep patternB(またはgrep patternA | grep -v patternB)を使用することです。するgrep論理AND(またはAND NOT)を実装しますが、単一またはawkコマンドperlの代わりに複数のコマンドを実行する必要があります。

答え2

grade1合計がある行を探したいとしましょう11

サンプルデータ(質問のデータとは異なります)と検索キー:

$ cat student
grade1 class1 11 student
grade1 class1 111 student
grade11 class1 21 student
grade12 class2 22 student
$ grade=grade1
$ num=11

\<単語の端に一致する/アンカーに注意しながら、与えられた文字列を直接把握します。\>これには次の順序が必要です。

$ grep "^$grade\>.*\<$num\>" student
grade1 class1 11 student

または-w完全な単語を一致させるには。

$ < student grep -w "$grade" |grep -w "$num"
grade1 class1 11 student

上記の両方は、行の他の場所で同様の単語と一致する可能性が高いため、awkを使用してこれを実行し、適切なフィールドのみを比較する方が良いかもしれません。これは、フィールドがスペースで区切られているため、スペース自体を含めることができないと仮定します。

$ awk -vg=$grade -vn=$num '$1 == g && $3 == n' student
grade1 class1 11 student

スペースを含むフィールドが必要な場合は、タブなどの他の区切り文字を使用することをお勧めします。

答え3

以下でこのコマンドを実行しています。

awk '{
if ($1!="grade1" || $3!=11)
print "###";
else
print $0;
}' student

出力は次のとおりです

grade1 class1 11 student
###
###
###

これは予想される出力です。

しかし、私が走ったらテストファイル、コードは次のとおりです。

read -p "Enter gradename: " gradename
read -p "Enter studentnumber: " studentnumber

echo "gradename = $gradename"
echo "studentnumber = $studentnumber"
awk '{
if ($1!="$gradename" || $3!=$studentnumber)
print "###";
else
print $0;
}' student > student2

cat student2

その後、出力は次のようになります。

Enter gradename: grade1
Enter studentnumber: 11
gradename = grade1
studentnumber = 11
###
###
###
###

非常に奇妙な

答え4

私はかつてawkのライナーの下で同じものを見つけ、うまくいきました。

 for i  in `awk '{print $1}' student.txt| sed -r "s/\s+//g"| sed '/^$/d'| sort -u` ; do awk -v i="$i" '$1 ~ i && $3 == "11"{print $0}'  student.txt ; done

生徒番号11を定数として確認したので、スクリプトで$ 3 = = 11に言及しました。

「i」の変数である Grade1 と Grade2

お客様の要件に応じて学位を変更することができます。必要に応じて $3=="Freshman Number" の値を変更します。

関連情報