2011-08-05 29 views
79

Tôi có tệp có thể chứa định dạng không đúng (trong trường hợp này, sự xuất hiện của mẫu \\backslash). Tôi muốn sử dụng grep để chỉ trả về số dòng nơi điều này xảy ra (như trong, trận đấu ở đây, đi tới dòng # x và sửa chữa nó).Sử dụng grep để báo cáo chỉ số dòng

Tuy nhiên, dường như không có cách nào để in số dòng (grep -n) và không phải là kết hợp hoặc chính dòng.

Tôi có thể sử dụng một regex khác để trích xuất số dòng, nhưng tôi muốn đảm bảo rằng grep không thể tự làm điều đó. grep -no đến gần nhất, tôi nghĩ, nhưng vẫn hiển thị trận đấu.

+0

Câu trả lời hữu ích nhất đối với tôi là trong câu hỏi : 'grep -no'! Điều này đã làm những gì tôi đến đây để thử và làm! (ví dụ: không in dòng đôi khi rất dài, ví dụ: các tệp nguồn JavaScript được rút gọn.) – LondonRob

Trả lời

113

thử điều này:

grep -n "text to find" file.ext |cut -f1 -d: 
+1

Trên máy của tôi, điều này chỉ in các tập tin phù hợp mà không có số dòng (vì vậy nếu tôi có 3 kết quả phù hợp bên trong một tập tin nó chỉ được in một lần) mà rất hữu ích ... –

+2

@MarioAwad, bạn nên thao tác '-f 'param. Với tôi đó là '-f2'. (Biết đây là những thứ cũ, nhưng tôi nghĩ rằng nó có thể giúp một số linh hồn nghèo) –

+0

cảm ơn kịch bản shell unix adhoc cũ đáng yêu. điều này cho thấy rằng các công cụ linh hoạt có giá trị phức tạp và đường cong học tập của chúng! – Alex

32

Nếu bạn đang mở để sử dụng AWK:

awk '/textstring/ {print FNR}' textfile 

Trong trường hợp này, FNR là số dòng. AWK là một công cụ tuyệt vời khi bạn đang tìm kiếm grep | cut, hoặc bất kỳ lúc nào bạn đang tìm cách lấy đầu ra grep và thao tác nó.

+1

Sử dụng một quá trình (mà quan trọng hơn trong quá khứ, nhưng vẫn còn), và dễ dàng, đủ để hiểu cho người mới bắt đầu awk! – bgStack15

+0

'NR' cũng hoạt động khi chỉ có một tệp đang được kiểm tra, như trong trường hợp này. –

1

Bạn sẽ muốn trường thứ hai sau dấu hai chấm, chứ không phải trường đầu tiên.

grep -n "text to find" file.txt | cut -f2 -d:

+0

Điều này có tác dụng nếu bạn muốn kết hợp văn bản, nhưng trong trường hợp số dòng là những gì OP đang yêu cầu. – AJP

19

Tất cả những câu trả lời yêu cầu grep để tạo ra toàn bộ dây chuyền phù hợp, sau đó ống nó vào một chương trình khác. Nếu dòng của bạn là rất dài, nó có thể là hiệu quả hơn để sử dụng chỉ sed để sản xuất các số dòng:

sed -n '/pattern/=' filename 
2

phiên bản Bash

lineno=$(grep -n "pattern" filename) 
    lineno=${lineno%%:*} 
+1

Và điều gì sẽ xảy ra nếu có nhiều dòng khớp với mẫu đó? – izabera

+0

@izabera thêm | tail -1 – Diego

0

Để đếm số dòng hợp các mô hình:

grep -n "Pattern" in_file.ext | wc -l 

Để trích xuất mô hình phù hợp

sed -n '/pattern/p' file.est 
.210

Để hiển thị số dòng trên mà mô hình được kết hợp

grep -n "pattern" file.ext | cut -f1 -d: 
+2

1st chỉ nên là "grep -c 'Pattern' in_file.ext". 2 phải là "grep -o 'Pattern' in_file.ext". Không cần phải liên quan đến sed hoặc wc. – thelogix

0

Tôi khuyên bạn nên câu trả lời với sedawk cho chỉ nhận được số dòng, thay vì sử dụng grep để có được toàn bộ dòng phù hợp và sau đó loại bỏ điều đó từ đầu ra với cut hoặc một công cụ khác. Cho đầy đủ, bạn cũng có thể sử dụng Perl:

perl -nE '/pattern/ && say $.' filename 

hay Ruby:

ruby -ne 'puts $. if /pattern/' filename 
0

chỉ sử dụng grep:

grep -n "text to find" file.ext | grep -Po '^[^:]+'

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