139

DbgView ログ ファイルから最初の 2 つの列 (興味がないもの) を削除しようとしています。3 列目から行末までを出力する例が見つからないようです。各行の列数は可変であることに注意してください。

4

19 に答える 19

127

...またはより簡単な解決策:cut -f 3- INPUTFILE 正しい区切り文字 (-d) を追加するだけで、同じ効果が得られます。

于 2009-10-21T17:11:26.733 に答える
127
awk '{for(i=3;i<=NF;++i)print $i}' 
于 2009-10-21T16:43:10.820 に答える
117
awk '{ print substr($0, index($0,$3)) }'

ここにある解決策:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/

于 2011-07-08T21:52:26.717 に答える
37

Jonathan Feinbergの答えは、各フィールドを別々の行に出力します。同じ行に出力用のレコードを再構築するために使用できますprintfが、フィールドを左にジャンプして移動することもできます。

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
于 2009-10-21T18:05:59.933 に答える
22
awk '{$1=$2=$3=""}1' file

注意: この方法では、1、2、3 フィールドに「空白」が残りますが、出力だけを見たい場合は問題ありません。

于 2009-10-24T02:33:36.017 に答える
9

次の行はどうですか:

awk '{$1=$2=$3=""; print}' ファイル

@ Ghostdog74 の提案に基づいています。行をフィルタリングすると、私の動作が改善されるはずです。つまり、次のようになります。

awk '/^exim4-config/ {$1=""; print }' ファイル
于 2011-06-01T15:38:21.283 に答える
8
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

これは、指定されたフィールド nr.、N の前にあるものを切り刻み、フィールド nr.N を含む行の残りすべてを出力し、元の間隔を維持します (再フォーマットしません)。フィールドの文字列が行のどこかに表示されていても問題ありません。これは、ダイサーの回答の問題です。

関数を定義します。

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

そして、次のように使用します。

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

出力は、末尾のスペースを含むすべてを維持します

「/n」がレコード区切り文字であるファイルでうまく機能するため、行内にその改行文字がありません。他のレコード セパレータと一緒に使用する場合は、次を使用します。

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

例えば。16 進数の文字番号を使用しない限り、ほとんどすべてのファイルでうまく機能します。1 行の内側。

于 2014-04-16T19:36:17.397 に答える
7
awk '{a=match($0, $3); print substr($0,a)}'

まず、3 番目の列の開始位置を見つけます。substr を使用すると、位置 (この場合は a) から行末までの行全体 ($0) を出力します。

于 2017-11-10T11:08:13.873 に答える
5

次の awk コマンドは、各行の最後の N フィールドを出力し、行の終わりに改行文字を出力します。

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

/usr/bin ディレクトリの内容を一覧表示し、最後の 3 行を保持し、awk を使用して各行の最後の 4 列を出力する例を以下に示します。

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype
于 2014-12-08T14:44:04.047 に答える
3

Perl ソリューション:

perl -lane 'splice @F,0,2; print join " ",@F' file

次のコマンド ライン オプションが使用されます。

  • -n入力ファイルのすべての行をループし、すべての行を自動的に出力しない

  • -l処理前に改行を削除し、後で追加し直します

  • -a自動分割モード – 入力行を @F 配列に分割します。空白で分割するのがデフォルト

  • -eperl コードを実行する

splice @F,0,2@F 配列から列 0 と 1 をきれいに削除します

join " ",@F各要素の間にスペースを使用して、@F 配列の要素を結合します

入力ファイルがスペース区切りではなくコンマ区切りの場合は、-F, -lane


Python ソリューション:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

于 2015-09-16T00:08:49.843 に答える
3

正規表現を使用すると、同じ効果を簡単に実現できます。セパレータがスペースであると仮定すると、次のようになります。

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
于 2009-10-21T16:46:58.317 に答える
3
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'
于 2019-10-01T12:14:42.827 に答える
1

ここで少し遅れましたが、上記のどれもうまくいかなかったようです。printf を使用して、それぞれの間にスペースを挿入して、これを試してください。最後に改行を入れないことにしました。

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
于 2013-01-24T20:41:34.993 に答える
1

Bash では、次の構文を位置パラメータとともに使用できます。

while read -a cols; do echo ${cols[@]:2}; done < file.txt

詳細: Bash Hackers Wiki の位置パラメーターの処理

于 2016-04-10T03:01:24.620 に答える
0
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

最初の 2 列がクリアされ、sed先頭のスペースが削除されます。

于 2016-11-23T12:48:35.933 に答える