web-dev-qa-db-ja.com

awkでレコードをスキップする方法

ログディレクトリに多数のファイルがあり、その名前にはタイムスタンプが付けられています(この場合はdate +%b[...])。

POSIX準拠のone-linerを書きたい:

どちらか

  • 2フィールド以下(awkで表示)で、正規表現定数ls -ltcを含まない/Jul/からの行出力をスキップします

または

  • ls -ltcによる最初の行出力と、/Jul/に一致しない行をスキップします。

結果は、最初の行だけが2つのフィールドで構成されているため(awkで表示されるように)、私の目的と同じです。

私は試した:

> ll -tc | rm $(awk --posix 'NF > 2 && !/Jul/ {print $NF;}')
> ll -tc | rm $(awk --posix 'NF > 2 !/Jul/ {print $NF;}')

NFの条件は、たとえばls | awk '/foo/ && /bar/'wouldのように正規表現の一致条件とうまく共存していないようであるため、どちらも構文が悪いです。

Sbは、任意のレコードをスキップする方法、および/またはNFの算術条件と正規表現のパターンマッチングを同時に適用する方法のポインタを提供できますか?私は周りを見回しましたが、探している文書化された構文を見つけることができませんでした...

2
Cbhihe

どちらか

awk 'NF<=2 || /Jul/ {next} {print}'

または

awk 'NR==1 || /Jul/ {next} {print}'

または、ロジックを反転してコマンドを短縮するか、

awk 'NF>2 && !/Jul/ {print}'

または

awk 'NR!=1 && !/Jul/ {print}'
~$ cat input
first line
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Jul second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
~$ awk 'NF<=2 || /Jul/ {next} {print}' input
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
~$ awk 'NR==1 || /Jul/ {next} {print}' input
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
2
kos

@ Kos は、あなたの質問に対して完全に正しい答えを与えました。

しかし、あなたは問題ではない問題を解決しようとしていると思います。特定の条件に一致するファイルを削除するには、findにパラメーター-deleteを使用する必要があります。

例えば:

find . -type f -newermt 2015-07-07  ! -newermt 2015-07-08 -delete
find . -type f -newerat 2015-07-07  ! -newerat 2015-07-08 -delete
1
A.B.