1

Linuxでこれまで使用awkしたことがないので、正規表現とどのように一致するかを理解しようとしています. たとえば、過去に私の経験に基づくと、正規表現/2/は次のすべての行で 2 に一致します。

  1. これは 2 に一致します
  2. これは 2 と一致しません

awk '{if(NR~2)print}' sample.txt、内容を持つコマンドを実行すると

  1. 2が一致します
  2. これは 2 と一致しません
  3. 2 一致する可能性があります

一致する行は、行 2 に一致しているThis will not match 2ことを示しています。これは、コマンドをawk '{if(NR~3)print}' sample.txtそれに 2 may be matchedコマンドも実行するawk '{if(NR~/^2$/)print}' sample.txtと、まったく同じ行、つまり行 2 に一致します。

ただし、http://www.youtube.com/watch?feature=player_detailpage&v=Htnno4CHVus#t=502sで参照しているソースは、そうではないことを示しているようです。

何が欠けていますか? コマンドは のコマンドとどのようにawk '{if(NR~2)print}' sample.txt異なりawk '{if(NR~/^2$/)print}' sample.txtますか?

4

2 に答える 2

4

条件NR~2は、レコード番号 NR が 2 に一致するかどうかをチェックします。2 行または 3 行の入力ファイルの場合、式は次のようになります。

if (NR == 2)

NR~3もちろん、 も同様です。試す:

awk '/2/'

これにより、行のテキスト ( $0) に 2 が含まれるすべての行が出力されます。デフォルトでは、正規表現は行全体に対して一致します。$3 ~ /3/たとえば、を使用して特定のフィールドに制限できます。

プログラムはパターンとアクションで構成されawk、パターンまたはアクションのいずれかを省略できます。

awk '{ if ($0 ~ /2/) print }
     /2/
     /2/ { if ($0 ~ /a.*z/) print "Matches a.*z"; }'

最初の行にはパターンがありません。のアクションは{ ... }入力行ごとに実行されます (ただし、条件付きのため、出力を生成するのは一部の入力行のみです。2 を含むすべての行が出力されます ( に引数がない場合、改行が続いprintて出力されます)。$0

2 行目にはパターンがありますが、アクションはありません。2 を含むすべての行が再度印刷されます。(不足しているアクションは と同等{ print }です。)

3 行目にはパターンとアクションの両方があります。2 と 'a' の後に 'z' が含まれるすべての行がリマークされます。


これら 2 つのコマンドの違いは何ですか?

 `awk '{if(NR~2)print}' sample.txt`
 `awk '{if(NR~/^2$/)print}' sample.txt`

最初のコマンドは、行番号 2、12、20..29、32、42、... 102、112、120..129、... 200..299、... を出力します。行番号に 2 が含まれるすべての行。

2 番目のコマンドは、行番号 2 のみを出力します。これ/^2$/は、値が文字列の開始、数字 2、および文字列の終了を含むように制限されているためです。


ソースが間違っているということですか?

YouTube のリソースを確認しましたが、YouTube が教えようとしていることを誤解されているに違いないと思います。について話すとき、2を含む行番号{if (NR~2) print}を出力すると言っているはずです。ビデオでは、2、12、20、21、22 などの行番号が引用されています。2 を含む行を言ってはいけません。私はビデオがそれを言っていると思いますが、ビデオは間違っています(しかしテキストは正確でした). NR との比較は実際には間違っていませんが、慣習的ではありません。NR に対する正規表現を説明する紹介ビデオに含めるかどうかはわかりません。そのため、ビデオの音声に不具合があるように見えますが、画面上のテキストは正確だと思います。私はまだ何かを見逃しているかもしれません。awk


awk '{ if ($0 ~ /2/) print }ファイルに対するコマンドは、sample.txt私が言及した内容で言うと、出力 2 が一致するだけになります。あれは正しいですか?

入力が与えられたそのコマンド:

2 will be matched
This will not match 2
2 may be matched

3 行すべてを出力します。それらはすべて数字の 2 を含んでいます。

printアクションも絵柄も だと思いました$0 ~ /2/

いいえ; パターンは空でした (開き波括弧の前に何もなかったため) — したがって、すべての行がそれに一致します — そしてアクションは波括弧の部分でした{ if ($0 ~ /2/) print }. 現在、アクションには条件が含まれていますが、それは別の問題です。

これで、コマンドawk '/2/' sample.txtは 3 行すべてを出力します。あれは正しいですか?

はい。

于 2012-06-16T22:11:45.693 に答える
1

NR処理中のレコードの番号を意味します... 行番号 2 と照合しています。

于 2012-06-16T22:11:34.833 に答える