web-dev-qa-db-ja.com

ファイル内の行の最初のn文字と最後のn文字をgrep

次のようなログファイルがあります。

Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639

次のような出力が必要です。

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639

私ができることは、行の最初の部分か最後の部分のどちらかをgrepすることです。 2つを組み合わせることができません。入力から必要な出力を取得するにはどうすればよいですか?

6
IAmAndroid

あなたはこのようなことをすることができます

awk '{print $1,$2,$3,":",$NF}' logfile
10
Prem Joshi

次のようにカットを使用できます。

コマンド:

cut --complement -c17-43 file1.txt

出力:

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
11
Stephen Rauch

sedを使用できます:

sed -r "s/^(.{15} ?).*(.{5})$/\1\2/" logfile

提案に従って、私は最初のパターンをゼロ詰めされない可能性がある1桁の日に対応させ、中央のパターンをより柔軟にするために.*を使用しました。

5
MikeD

Awkでは、このようなものです。とても簡単です。

[zee@dev-instance temp]$ cat file1.txt 
Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639
[zee@dev-instance temp]$ awk -F" " '{ print $1" "$2" "$3" : "$10 }'<file1.txt 
Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
[zee@dev-instance temp]$ 
3
zee
Perl -F '' -lane 'print @F[0..15, -5..-1]' yourfile

説明

-F '' =>行を個々の文字IOWに分割します。すべてのフィールドは1文字の太さです。

-l => ORS=\n

-a => @F array holds the fields, e.g., $F[15] => holds the 16-th character

-n => don't print unless specifically asked to

@F[0..15, -5..-1] =>は配列のスライスです@F最初の16文字と最後の5文字で、cutのように

2
user218374

これはどう:

sed -e 's/^\(.\{4\}\).*\(.\{4\}\)$/\1 \2/'

(I/Oリダイレクトを理解したり、ファイル名を指定したりできます。詳細については、sed(1)を参照してください。)

ここでは、文字数を正確に4に選択しましたが、好きな数に置き換えることができます。最初と最後の文字数は異なる場合があることに注意してください。

sed -e 's/^\(.\{5\}\).*\(.\{2\}\)$/\1 \2/'

これにより、各行の最初の5文字と最後の2文字が返されます。これをさらにパラメーター化する方法を理解するのは、あなたに任せます。

また、私はgrep(1)(またはそのバリアントの1つ)ではなくsed(1)を選択したことに注意してください。これは、sed正規表現ではなく、grep正規表現を要求した場合とまったく異なる場合があることを知っています。

2
Phelonius

あなたはこのようなことをすることができます

cut -c1-15 logfile > file;

cut -c44- logfile > file1;

paste file file1 > logfilenew;

rm file file1;

cat logfilenew

出力はlogfilenewに保存されます。

2
Modassir Haider