2012-11-28 27 views
11

Cân nhắc tôi có dòng dữ liệu sau:Sử dụng grep cho nhiều mẫu tìm kiếm

BODY1 
attrib1: someval11 
attrib2: someval12 
attrib3: someval13 

BODY2 
attrib1: someval21 
attrib2: someval22 
attrib3: someval23 

BODY3 
attrib1: someval31 
attrib2: someval32 
attrib3: someval33 

tôi muốn trích xuất chỉ attrib1 và attrib3 cho mỗi BODY, tức là

attrib1: someval11 
attrib3: someval13 
attrib1: someval21 
attrib3: someval23 
attrib1: someval31 
attrib3: someval33 

tôi đã cố gắng

grep 'attrib1\|attrib3', theo số this site nhưng không trả lại gì. grep attrib1grep attrib2 làm dữ liệu trả về nhưng chỉ cho một mẫu được chỉ định.

+0

Không phải là nó giải quyết vấn đề của bạn, nhưng nó có thể được dễ dàng hơn để làm theo và nhanh hơn cho grep để tìm nếu regex của bạn là 'attrib [13 ] '. Làm cho phần chung lâu hơn thường tốt hơn. –

+0

nếu không có mẫu hình chữ nhật giữa người gác 1 và 3 thì sao? nếu họ được đặt tên một cái gì đó hoàn toàn khác nhau? – amphibient

+0

trong ví dụ thực, attrib1 của tôi được gọi là foo và attrib3 được gọi là thanh ... – amphibient

Trả lời

15

grep -e 'attrib1' -e 'attrib3' file

Từ trang man:

PATTERN -e, --regexp = PATTERN
Sử dụng PATTERN như mô hình. Điều này có thể được sử dụng để chỉ định nhiều mẫu tìm kiếm hoặc để bảo vệ mẫu bắt đầu bằng dấu gạch ngang (-). (-e được xác định bởi POSIX.)

Edit: Ngoài ra, bạn có thể lưu mẫu trong một tập tin và sử dụng -f tùy chọn:

[email protected]:~$ cat>patt 
attrib1 
attrib3 

[email protected]:~$ grep -f patt test 
attrib1: someval11 
attrib3: someval13 
attrib1: someval21 
attrib3: someval23 
attrib1: someval31 
attrib3: someval33 
+0

grep: tùy chọn bất hợp pháp - e.Tôi đang sử dụng SunOS – amphibient

+0

Như trang người đàn ông nói, -e được chỉ định bởi POSIX nên nó sẽ hoạt động. Tôi sẽ thử và tìm giải pháp thay thế. – axiom

+0

@foampile Bạn có thể thử xem tùy chọn '-f' có sử dụng hay không. Cũng lưu ý rằng đối với ví dụ của bạn, 'grep 'attrib1 \ | attrib3'' cũng sẽ hoạt động tốt. – axiom

0

này hoạt động, với GNU grep 2.6.3

grep "attrib[13]" 

hoặc

grep "^[^0-9]*[13]:" 
+0

nếu không có mẫu hình chữ nhật giữa người gác 1 và 3 thì sao? nếu họ được đặt tên một cái gì đó hoàn toàn khác nhau? – amphibient

+0

Bạn đang tìm gì, 1 hoặc 3 ở cuối từ đầu tiên của dòng và sau đó là dấu hai chấm? – Sirch

0

Nó phụ thuộc vào vỏ bạn đang sử dụng. grep -iw 'patter1\|patter2\|pattern3' hoạt động trên bash shell khi nó không hoạt động trên vỏ korn. Đối với vỏ korn, chúng tôi có thể phải thử grep -e pattern1 -e patter2 và vân vân.

+0

Vỏ nào bạn sử dụng không có mang trực tiếp về những tham số nào mà lệnh 'grep' bên ngoài hỗ trợ. – tripleee

10

Cũng egrep;

egrep "pattern1|pattern2|pattern3" file 
8

lệnh rất đơn giản:

bash> grep "attrib1\|attrib3" <file.name> 

attrib1: someval11 attrib3: someval13 attrib1: someval21 attrib3: someval23 attrib1: someval31 attrib3: someval33

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