2010-04-08 33 views
21

Tôi có một tập lệnh tạo hai dòng dưới dạng đầu ra mỗi lần. Tôi thực sự chỉ quan tâm đến dòng thứ hai. Hơn nữa, tôi chỉ quan tâm đến văn bản xuất hiện giữa một cặp # trên dòng thứ hai. Ngoài ra, giữa các băm, một dấu phân cách khác được sử dụng:^A. Nó sẽ là tuyệt vời nếu tôi cũng có thể phá vỡ từng phần của văn bản đó là^A-phân (Lưu ý rằng^A là SOH ký tự đặc biệt và có thể được đánh máy bằng cách sử dụng tổ hợp phím Ctrl-A)Nhận dòng đầu ra văn bản thứ n

Trả lời

6
your.program | tail +2 | cut -d# -f2 

nên giúp bạn có được 2/3 đường.

+1

là cắt các tiện ích tốt nhất để sử dụng trên một số tiền undeterminate của giá trị được giới hạn bởi^A? – syker

+1

Tôi không chắc chắn. Tôi thực sự không hiểu mục tiêu của bạn là gì về^A. Để biến chúng thành thứ gì đó khác? Ngắt dòng? – Grumdrig

0

bash:

read 
read line 
result="${line#*#}" 
result="${result%#*}" 
IFS=$'\001' read result -a <<< "$result" 

$result hiện nay là một mảng chứa các yếu tố bạn quan tâm Chỉ cần ống đầu ra của kịch bản để thế này..

57
output | sed -n '1p' #prints the 1st line of output 

output | sed -n '1,3p' #prints the 1st, 2nd and 3rd line of output 
+2

Câu trả lời của bạn tốt hơn. Không chắc chắn lý do tại sao một số khác được chấp nhận. Rất bối rối. – Fuser97381

+1

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn! @ n-1-1 Bạn có biết nếu có thể chỉ định các dòng 1,3,5 thay vì 1-5 bằng sed? Tôi không thể tìm thấy bất cứ điều gì bản thân mình. – Olshansk

1

Tôi có thể sử dụng awk cho điều đó.

your_script | awk -F# 'NR == 2 && NF == 3 { 
          num_tokens=split($2, tokens, "^A") 
          for (i = 1; i <= num_tokens; ++i) { 
           print tokens[i] 
          } 
          }' 

này nói

1. Set the field separator to # 
2. On lines that are the 2nd line, and also have 3 fields (text#text#text) 
3. Split the middle (2nd) field using "^A" as the delimiter into the array named tokens 
4. Print each token 

Rõ ràng điều này làm cho rất nhiều giả định. Bạn có thể cần phải tinh chỉnh nó nếu, ví dụ, # hoặc^A có thể xuất hiện hợp pháp trong dữ liệu, mà không bị phân cách. Nhưng một cái gì đó như thế sẽ giúp bạn bắt đầu. Bạn có thể cần phải sử dụng nawk hoặc gawk hoặc một cái gì đó, tôi không hoàn toàn chắc chắn nếu đồng bằng awk có thể xử lý tách trên một nhân vật điều khiển.

0

đây là một giải pháp awk thể

awk -F"#" 'NR==2{ 
for(i=2;i<=NF;i+=2){ 
    split($i,a,"\001") # split on SOH 
    for(o in a) print o # print the splitted hash 
} 
}' file 
1

Cải thiện câu trả lời Grumdrig của:

your.program | head -n 2| tail -1 | cut -d# -f2 
Các vấn đề liên quan