Hiển thị tên tệp và số dòng trong đầu ra grep


87

Tôi đang cố gắng tìm kiếm thư mục rails của mình bằng grep. Tôi đang tìm một từ cụ thể và tôi muốn grep để in ra tên tệp và số dòng.

Có cờ grep nào sẽ làm điều này cho tôi không? Tôi đã cố gắng sử dụng kết hợp -n-lnhưng chúng đều in ra tên tệp không có số hoặc chỉ đổ ra nhiều văn bản vào thiết bị đầu cuối mà không thể dễ dàng đọc được.

Ví dụ:

  grep -ln "search" *

Tôi có cần chuyển nó sang awk không?


Câu trả lời:


138

Tôi nghĩ -llà quá hạn chế vì nó ngăn chặn đầu ra của -n. Tôi sẽ đề nghị -H( --with-filename): In tên tệp cho mỗi trận đấu.

grep -Hn "search" *

Nếu điều đó cung cấp quá nhiều đầu ra, hãy cố gắng -ochỉ in phần phù hợp.

grep -nHo "search" * 

Câu trả lời này cũng làm việc cho tôi. Tôi đang cần tìm kiếm đệ quy và sử dụng lệnh ví dụ này: grep -Hnor "localhost". Danh sách này thiết lập tất cả các kết quả trùng khớp với tên tệp và số dòng, ngắn gọn và súc tích.
Tore Aurstad

Điều này cũng hiển thị kết quả chứ không chỉ tên tệp và số dòng
elig

30
grep -rin searchstring * | cut -d: -f1-2

Điều này có nghĩa là, tìm kiếm đệ quy (đối với chuỗi searchstringtrong ví dụ này), bỏ qua chữ hoa chữ thường và hiển thị số dòng. Đầu ra từ grep đó sẽ giống như sau:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

Tiếp theo, chúng ta chuyển kết quả đó đến lệnh cut bằng cách sử dụng dấu hai chấm :làm dấu phân cách trường và hiển thị các trường từ 1 đến 2.

Khi tôi không cần số dòng, tôi thường sử dụng -f1(chỉ tên tệp và đường dẫn), sau đó chuyển đầu ra đến uniq, để tôi chỉ thấy mỗi tên tệp một lần:

grep -ir searchstring * | cut -d: -f1 | uniq

1
Tôi cảm thấy điều này trả lời tốt nhất câu hỏi ban đầu. Chỉ tên tệp và số dòng.
mastaBlasta

1
Lưu ý rằng điều này không hoạt động nếu bạn có tên đường dẫn tuyệt đối của Windows như `C: \ Users \ me \ git` vì nó đã chứa một dấu hai chấm.
hirse

19

Tôi thích sử dụng:

grep -niro 'searchstring' <path>

Nhưng đó chỉ là vì tôi luôn quên những cách khác và tôi không thể quên Robert de grep -niro vì một lý do nào đó :)


Chưa bao giờ tôi nghĩ rằng tôi sẽ nhận được sự ủng hộ cho những điều trên. Chỉ là một chia sẻ vui vẻ. Cảm ơn! (Nhưng nó thực sự hoạt động - ít nhất là trên MacOS)
Bas van Ommen

Yêu cách của bạn để ghi nhớ điều này!
Greg Hilston

0

Nhận xét từ @ToreAurstad có thể được viết chính tả grep -Horn 'search' ./, dễ nhớ hơn.

grep -HEroine 'search' ./ cũng có thể hoạt động;)

Đối với những người tò mò:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse

0

Đây là cách tôi sử dụng câu trả lời ủng hộ để tìm kiếm một cây nhằm tìm các tệp fortran có chứa một chuỗi:

find . -name "*.f" -exec grep -nHo the_string {} \;

Nếu không có nHo, bạn chỉ học được rằng một số tệp, ở đâu đó, khớp với chuỗi.

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.