コマンド出力から2番目の列を取得する方法は?


152

私のコマンドの出力は次のようなものです:

1540 "A B"
   6 "C"
 119 "D"

最初の列は常に数値で、その後にスペースが続き、その後に二重引用符で囲まれた文字列が続きます。

私の目的は、次のような2番目の列のみを取得することです。

"A B"
"C"
"D"

<some_command> | awk '{print $2}'これを達成するために使用するつもりでした。しかし問題は、2番目の列の一部の値にスペースが含まれていることですawk。これは、フィールドを区切るためのデフォルトの区切り文字です。したがって、出力はめちゃくちゃになります。

"A
"C"
"D"

2番目の列の値(ペアの引用符を含む)をきれいに取得するにはどうすればよいですか?



1
を使用してみましたawk '{$1=""; print $0}'が、まだ空白文字が先行しています。で削除できますsed '/^ //'。それでも、これでできるawkでしょうか?
Qiang Xu

回答:


29

または、sed&regexを使用します。

<some_command> | sed 's/^.* \(".*"$\)/\1/'

開始マーカーと終了マーカーが不要なため、コマンドを短くする:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo

197

s -F [field separator]の行を分割するために使用し"ます。

awk -F '"' '{print $2}' your_input_file

またはパイプからの入力用

<some_command> | awk -F '"' '{print $2}'

出力:

A B
C
D

3
これは良いですが、元の引用文も必要です。できますか?ありがとう。
Qiang Xu

5
あなたはカンニングし、awkのプリントを次のように変更できます'{print "\""$2"\""}'
Alex

うん、これはうまくいきます。どうもありがとう、アレックス!ところで、非常に多くの引用、:)
Qiang Xu

@アレックス、二重引用符とバックスラッシュを使用して、操作が必要なものを取得する方法を説明できますか?
Timo

1
@Timo引用符とバックスラッシュの内訳は次のように想定できます"\"" + $2 + "\""。周囲の引用符は、出力に追加されるものを示しており、エスケープされた引用符(\")が印刷されています。それを視覚化するため$2に、引用符の代わりに空白スペースを追加したい場合、次のようになります'{print " "$2" "}'。我々はまた、完全に理解するためにそれを少し簡単にするための間隔フォーマットを追加することができます:'{print " " $2 " "}'
トム・

80

'awk'以外を使用できる場合は、代わりにこれを試してください

echo '1540 "A B"' | cut -d' ' -f2-

-dは区切り文字、-fは 切り取るフィールドです。-f2-を使用すると、2番目のフィールドを最後まで切ります。


これは私が次のことをしようとするのに役立ちました(gitでファイルのコミットIDをフェッチ):git annotate myfile.cpp | grep '2016-07' | 頭-1 | カット-f1
serup

2
これは適切ですが、区切り文字が複数の文字である場合は機能しません。ここでawkソリューションが
役に立ちます

2
後にスペースが使用されないのはなぜ-dですか?そのように少し奇妙に見えます。
Chris Stryczynski 2017年

43

これは、コマンド出力「docker images」から特定の列を取得するために機能するはずです。

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB


docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7

これは3列目を印刷します


ドッカー画像のアウトを見たことがありますか?awk '{print $ 5}'?
Shashi Ranjan 2017

17

そのためにawkは必要ありません。readBashシェルで使用するだけで十分です。

some_command | while read c1 c2; do echo $c2; done

または:

while read c1 c2; do echo $c2; done < in.txt

13

あなたがGNU awkを持っているなら、これはあなたが望む解決策です:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"


0
#!/usr/bin/python
import sys 

col = int(sys.argv[1]) - 1

for line in sys.stdin:
    columns = line.split()

    try:
        print(columns[col])
    except IndexError:
        # ignore
        pass

次に、スクリプトの名前をcoとすると、たとえば、次のようにしてファイルのサイズを取得します(この例ではLinuxを使用していると想定していますが、スクリプト自体はOSに依存していません)。

ls -lh | co 5

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.