grepを使用してフィルタリングする

grepを使用してフィルタリングする

次の行を含む file.txt があるとします。

hello myname1 is yellow.pcapng red
festive myname33 is hddd.pcapng dfdf
crude myname44 is hello.pcapng

ここでの私の目標は、次のように out.txt に出力されるように行をフィルタリングすることです。

myname1 yellow.pcapng
myname33 hddd.pcapng
myname44 hello.pcapng

これで、以下が使用できることがわかりました。

grep -oh "\w*myname\w*" /tmp/file.txt  > /tmp/out.txt
grep -o '[^ ]\+g' /tmp/file.txt > /tmp/out.txt 

式のそれぞれの部分を個別に取得します。これらのコマンドを組み合わせて、希望する出力を得るにはどうすればよいですか?

答え1

サンプル データを考えると、単語 #2 と #4 が抽出したいものであると想定できます。これを awk で表現するには、次のようにします。

awk '{ print $2, $4 }' < /tmp/file.txt > /tmp/out.txt

答え2

次のように使用できますcut:

cut -d' ' -f2,4 < /tmp/file.txt > /tmp/out.txt 

答え3

grep の代わりに awk を使用します。

awk '{print $2,$4}' /tmp/file.txt > /tmp/out.txt

cat file.txtの出力を にパイプしていますawk

次に、awk 式を使用して'{print $2,$4}'、分割行の 2 番目と 4 番目のフィールドをスペースで区切って出力します。

出力は希望どおりになります。

答え4

上記でシェルスクリプトメソッドが提供されているので、Pythonで試してみましたが、問題なく動作しました。

#!/usr/bin/python
o=[]
k=open('i','r')
for z in k:
    o.append(z.strip().split(' ')[1])
        o.append(z.strip().split(' ')[3])
for d in range(0,len(o),2):
    print " ".join(o[d:d+2])

出力

myname1 yellow.pcapng
myname33 hddd.pcapng
myname44 hello.pcapng

関連情報