DbgView ログ ファイルから最初の 2 つの列 (興味がないもの) を削除しようとしています。3 列目から行末までを出力する例が見つからないようです。各行の列数は可変であることに注意してください。
19 に答える
...またはより簡単な解決策:cut -f 3- INPUTFILE
正しい区切り文字 (-d) を追加するだけで、同じ効果が得られます。
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{ print substr($0, index($0,$3)) }'
Jonathan Feinbergの答えは、各フィールドを別々の行に出力します。同じ行に出力用のレコードを再構築するために使用できますprintf
が、フィールドを左にジャンプして移動することもできます。
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file
注意: この方法では、1、2、3 フィールドに「空白」が残りますが、出力だけを見たい場合は問題ありません。
次の行はどうですか:
awk '{$1=$2=$3=""; print}' ファイル
@ Ghostdog74 の提案に基づいています。行をフィルタリングすると、私の動作が改善されるはずです。つまり、次のようになります。
awk '/^exim4-config/ {$1=""; print }' ファイル
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 行の内側。
awk '{a=match($0, $3); print substr($0,a)}'
まず、3 番目の列の開始位置を見つけます。substr を使用すると、位置 (この場合は a) から行末までの行全体 ($0) を出力します。
次の 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
Perl ソリューション:
perl -lane 'splice @F,0,2; print join " ",@F' file
次のコマンド ライン オプションが使用されます。
-n
入力ファイルのすべての行をループし、すべての行を自動的に出力しない-l
処理前に改行を削除し、後で追加し直します-a
自動分割モード – 入力行を @F 配列に分割します。空白で分割するのがデフォルト-e
perl コードを実行する
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
正規表現を使用すると、同じ効果を簡単に実現できます。セパレータがスペースであると仮定すると、次のようになります。
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'
ここで少し遅れましたが、上記のどれもうまくいかなかったようです。printf を使用して、それぞれの間にスペースを挿入して、これを試してください。最後に改行を入れないことにしました。
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
Bash では、次の構文を位置パラメータとともに使用できます。
while read -a cols; do echo ${cols[@]:2}; done < file.txt
詳細: Bash Hackers Wiki の位置パラメーターの処理
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
最初の 2 列がクリアされ、sed
先頭のスペースが削除されます。