Làm thế nào để có được cột thứ hai từ đầu ra lệnh?


152

Đầu ra của lệnh của tôi là một cái gì đó như:

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

Cột đầu tiên luôn là một số, theo sau là khoảng trắng, sau đó là chuỗi trích dẫn kép.

Mục đích của tôi là chỉ lấy cột thứ hai, 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 là, một số giá trị trong cột thứ hai chứa (các) khoảng trắng, đây là dấu phân cách mặc định awkđể phân tách các trường. Do đó, đầu ra bị rối:

"A
"C"
"D"

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



1
Tôi đã thử sử dụng awk '{$1=""; print $0}', nhưng nó vẫn có một nhân vật khoảng trắng hàng đầu. 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?
Qiang Xu

Câu trả lời:


29

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

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

Cd ngắn hơn vì bạn không cần đánh dấu bắt đầu và kết thúc:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo

197

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 ố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 trích dẫn xung quanh ban đầu. Nó có thể được thực hiện? Cảm ơn.
Qiang Xu

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

Yup, cái này hoạt động. Cảm ơn rất nhiều, Alex! Nhân tiện, rất nhiều trích dẫn, :)
Qiang Xu

@Alex, bạn có thể giải thích cách bạn sử dụng dấu ngoặc kép và dấu gạch chéo ngược để có được những gì op muốn.
Timo

1
@Timo Các phân tích trích dẫn và dấu gạch chéo ngược có thể được hình dung là "\"" + $2 + "\"". Các dấu ngoặc kép xung quanh đang chỉ ra một cái gì đó sẽ được thêm vào đầu ra và dấu ngoặc kép thoát ( \") đang được in. Để giúp trực quan hóa nó, đây là giao diện nếu chúng ta muốn thêm khoảng trắng xung quanh $2thay vì dấu ngoặc kép : '{print " "$2" "}'. Chúng tôi cũng có thể thêm khoảng cách định dạng để dễ dàng hơn một chút:'{print " " $2 " "}'
Tom

80

Nếu bạn có thể sử dụng thứ gì đó ngoài 'awk', thì hãy thử cái này thay thế

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

-d là một dấu phân cách, -f là trường cần 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.


điều này đã giúp tôi cố gắng thực hiện theo (tìm nạp id của tệp trong git): git annotate myfile.cpp | grep '2016-07' | đầu -1 | cắt -f1
serup

2
Đ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 giải pháp awk có ích
smac89

2
Tại sao một không gian không được sử dụng sau -d? Có vẻ hơi kỳ quặc theo cách đó.
Chris Stryczynski

43

Điều này sẽ làm việc để có được một cột cụ thể ra khỏi lệnh "hình ảnh docker":

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


Bạn đã thấy đưa ra hình ảnh docker | awk '{in $ 5}'?
Shashi Ranjan

17

Bạn không cần awk cho điều đó. Sử dụng readtrong Bash shell là đủ, vd

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

hoặc là:

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

13

Nếu bạn có GNU awk thì đâ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

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

Sau đó, giả sử bạn đặt tên cho tập lệnh là co, giả sử, làm một cái gì đó như thế này để lấy kích thước của các tệp (ví dụ giả sử bạn đang sử dụng Linux, nhưng bản thân tập lệnh độc lập với hệ điều hành): -

ls -lh | co 5

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.