次の形式行を含むファイルがあります。
2021-Jan-26 05:35 foo bar 2
2021-Jan-26 05:37 asdf 2 foo bar
2021-Jan-26 05:37 foo
私が興味のあるパターンは、位置20から始まります。したがって、特定のパターンのファイルを見つけるときは、最初の19文字をスキップしたいと思います(一致しません)。
だから最初の19文字を除いて、行のどこでもパターンを一致させたいと思います。
上記の例では、 を grep すると2
ライン 1 とライン 2 のみを一致させようとします。
どうすればいいですかgrep
?
答え1
grep
最初の19文字を無視し、必要なパターンのみを一致させるGNUオプションを使用してください。
grep -P "(?<=.{19})2" file
出力:
2021年1月26日 05:35 プーバ2 2021年1月26日05:37 asdf2豊富なバー
答え2
実際に最初の19個を一致させたいのですが「何でも」と一致させます。
だから
grep '^....................*2'
20点あります。^
行の先頭にパターンを固定します。次の19点はそれぞれ1文字に一致するため、効果的にスキップされます。次に、.*
ゼロ個以上の文字を一致させ、目的の2
パターンを一致させます。
次の方法で効率を向上できます。
grep '^..................[^2]*2'
行の先頭に一致し、19文字以上が一致し、2
この2
場合には大きな違いはありませんが、検索されるパターンがより複雑な場合、この最適化は非常に役立ちます。