2013-04-21 23 views
86

lệnh của tôi là một cái gì đó như:Cách lấy cột thứ hai từ đầu ra lệnh? sản lượng

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

Cột đầu tiên luôn luôn là một con số, theo sau là một không gian, sau đó là một chuỗi dụng dấu ngoặc kép.

Mục đích của tôi là để có được cột thứ hai chỉ, như:

"A B" 
"C" 
"D" 

tôi dự định sử dụng <some_command> | awk '{print $2}' để thực hiện điều này. Nhưng câu hỏi đặt ra là, một số giá trị trong cột thứ hai chứa (các) khoảng trắng, sẽ là dấu phân cách mặc định cho awk để tách các trường. Do đó, đầu ra bị sai lệch:

"A 
"C" 
"D" 

Làm cách nào để nhận giá trị của cột thứ hai (có dấu ngoặc kép)?

+1

http://stackoverflow.com/questions/2961635/using-awk-to-print-all-columns-from-the-nth-to-the-last –

+1

Tôi đã thử sử dụng 'awk' {$ 1 = ""; in $ 0} '', nhưng nó vẫn có một ký tự khoảng trắng. Nó có thể được gỡ bỏ bởi 'sed '/^//''. Tuy nhiên, điều này có thể được thực hiện với 'awk'? –

Trả lời

22

Hoặc sử dụng sed & regex.

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

Khá gọn gàng! Cảm ơn! –

116

Sử dụng -F [field separator] để phân chia các dòng trên " s:

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

hoặc cho đầu vào từ ống

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

đầu ra:

A B 
C 
D 
+3

Điều này là tốt, nhưng tôi cũng muốn các dấu ngoặc kép xung quanh ban đầu. Nó có thể được thực hiện? Cảm ơn. –

+5

bạn có thể lừa đảo và thay đổi bản in của awk thành '' {print "\" "$ 2" \ ""} '' – Alex

+0

Yup, công việc này. Cảm ơn rất nhiều, Alex! Nhân tiện, rất nhiều trích dẫn, :) –

9

Nếu bạn có GNU awk này là giải pháp bạn muốn:

$ awk '{print $1}' FPAT='"[^"]+"' file 
"A B" 
"C" 
"D" 
0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file 
54

Nếu bạn có thể sử dụng một cái gì đó khác hơn là 'awk', sau đó thử này để thay thế

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

-d là dấu phân cách, -f là lĩnh vực để cắt và với -f2- chúng tôi dự định cắt trường thứ 2 cho đến khi kết thúc.

+0

điều này đã giúp tôi cố gắng làm theo (lấy cam kết id của một tập tin trong git): git chú thích myfile.cpp | grep '2016-07' | đầu -1 | cut -f1 – serup

+0

Điều này là tốt, nhưng không hoạt động nếu dấu phân cách dài hơn một ký tự. Đó là nơi mà các giải pháp awk có ích – smac89

+0

Tại sao một không gian không được sử dụng sau khi '-d'? Có vẻ hơi kì lạ theo cách đó. –

12

Bạn không cần phải lo lắng về điều đó. Sử dụng read trong Bash shell là đủ, ví dụ:

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

hay:

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

này nên làm việc để có được một cột cụ thể ra khỏi đầu ra lệnh "Docker hình ảnh":

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 

Điều này sẽ in cột thứ ba

+0

Bạn đã từng xem ảnh docker chưa | awk '{print $ 5}'? –

Các vấn đề liên quan