私の入力ファイルは次のようなものです。
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher
タイプが学生の場合にのみ、sedを使用してすべてのIDnoとタイプを抽出します。
sed -e '/IDno=/b' -e '/Type=Student/b' d
これにより、ID学生ではなく、学生タイプのすべての行が取得されます。
私は手に入れたい
IDno="1"
Type=Student
IDno="2"
しかし、私は得ています
Type=Student
何が間違っていますか?
egrep
は、ファイルから複数の行を取得できます。パイプ|
をセパレータとして使用すると、必要な数のさまざまな基準をプルできます。 egrep
はgrep -E
と同等です。 egrep
は、/bin
フォルダーにあるスクリプトであり、その内容はexec grep -E "$@"
を指します。
例:
egrep "IDno=|Type=Student" inputfile
または
grep -E "IDno=|Type=Student" inputfile
出力する必要があります:
IDno="1"
Type=Student
IDno="2"
お役に立てれば!
sed
を使用すると、特定の行を印刷するには、-n
オプションとp
コマンドを使用する方が簡単です。
sed -rn '/IDno=|Type=Student/p'
または:
sed -n -e '/IDno=/p' -e '/Type=Student/p'
-n
オプションは、明示的に印刷しない限り出力を抑制します。もちろん、p
コマンドは一致する行を出力します。
awk
:
フィールドセパレータを=
として設定し、Type=Student
を含むレコードをレコード全体として、またはIDno
を最初のフィールドとして印刷します。
awk -F= '$1=="IDno" || $0=="Type=Student"'
Perl
:
IDno
で始まり、=
が続く行、またはType
で始まり、=
が続き、Student
で終わる行を印刷します。
Perl -ne 'print if /^(IDno=|Type=Student$)/'
例:
% cat file.txt
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher
% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"
% Perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
元の質問は、すべてのIDnoとタイプを抽出するために」を求めているようですタイプが学生の場合のみ "しかし、例出力はすべてのIDno =行を返すため、かなり矛盾しています...
Type = Studentの場合にIDnoとTypeのみを返す回答を次に示します。
sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="
少し説明:
-n, --quiet, --silent
パターンスペースの自動印刷を抑制しますN;N;
入力の次の行をパターンスペースに読み込み/追加します。 (2回)/IDno=.*Type=Student/p
IDno =からType = Studentまで検索して印刷| grep -v "^Name="
Name =行を表示しない私はsed | grepが好きではありませんが、出力を再検索するためにsedを取得する方法がわからないため、パイプは一般的に「この出力を取得して何かをする」と言います... grep | sedもできます
grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'