2011-01-25 26 views
38

Tôi có một tệp mà tôi muốn grep cho các dòng bắt đầu bằng -rwx hoặc drwx AND kết thúc bằng bất kỳ số nào.Grep cho đầu và cuối dòng?

Tôi đã có điều này, nhưng nó không hoàn toàn đúng. Bất kỳ ý tưởng?

grep [^.rwx]*[0-9] usrLog.txt 

Trả lời

39

Phần khó khăn là một regex có dấu gạch ngang là một trong các ký tự hợp lệ trong lớp ký tự. Dấu gạch ngang phải đến ngay sau khi bắt đầu cho một lớp nhân vật (bình thường) và ngay sau dấu mũ cho một lớp nhân vật phủ định. Nếu bạn cần một khung hình vuông gần, thì bạn cần có khung vuông gần sau dấu gạch ngang. Thương xót, bạn chỉ cần dấu gạch ngang, do đó ký hiệu được chọn.

grep '^[-d]rwx.*[0-9]$' "[email protected]" 

Xem: Regular Expressionsgrep để biết chi tiết tiêu chuẩn POSIX.

+2

Hoặc 'grep -x '[-d] rwx. * [0-9]''. – ephemient

+0

Trên Linux, có - hoặc nơi GNU grep được sử dụng. Các phiên bản tôi trích dẫn sẽ làm việc trên tất cả các biến thể Unix, mà tôi sẽ gửi làm cho nó tốt hơn. –

+2

'-x' là POSIX. Dấu ngoặc sau dấu gạch ngang: '[[.-.] [.].]]' (Được cấp, ít đọc hơn '[] -]'). Tôi * tin * đây cũng là POSIX… – ephemient

3

Bạn có thể muốn egrep. Hãy thử:

egrep '^[d-]rwx.*[0-9]$' usrLog.txt 
15

Dường như bạn đã đi đúng hướng ... Nhân vật ^ trận đấu bắt đầu-of-line, và $ trận đấu kết thúc-of-line. Mô hình của Jonathan sẽ phù hợp với bạn ... chỉ muốn cung cấp cho bạn lời giải thích đằng sau nó

+3

Không hoàn toàn đi đúng hướng. Điều quan trọng cần lưu ý là các ký tự bên trong một lớp ký tự '[]' hoạt động khác biệt đáng kể so với các phần khác của regex. – ephemient

1

là bạn phân tích cú pháp đầu ra của ls -l?

Nếu bạn đang có, và bạn chỉ muốn lấy tên tập tin

find . -iname "*[0-9]" 

Nếu bạn không có sự lựa chọn vì usrLog.txt được tạo ra bởi một cái gì đó/người khác và bạn hoàn toàn phải sử dụng tập tin này, tùy chọn khác bao gồm

awk '/^[-d].*[0-9]$/' file 

của Ruby (1.9+)

ruby -ne 'print if /^[-d].*[0-9]$/' file 

Bash

while read -r line ; do case $line in [-d]*[0-9]) echo $line; esac; done < file 
4

Cần lưu ý rằng dấu mũ (^) sẽ không hoạt động khác nhau trong ngoặc đơn, nó sẽ có kết quả ngược lại khi đặt nó bên ngoài dấu ngoặc vuông. Đặt dấu mũ mà bạn có nó sẽ tìm kiếm tất cả các chuỗi KHÔNG bắt đầu bằng nội dung bạn đã đặt trong dấu ngoặc vuông. Bạn cũng muốn đặt dấu chấm trước dấu hoa thị ở giữa các dấu ngoặc như với grep, nó cũng hoạt động như một "ký tự đại diện".

grep ^[.rwx].*[0-9]$ 

Điều này sẽ phù hợp với bạn, tôi nhận thấy rằng một số áp phích đã sử dụng một lớp nhân vật trong biểu thức của chúng là một phương pháp hiệu quả, nhưng tôi đang cố gắng sử dụng càng gần bạn càng tốt giải thích mọi thay đổi nhỏ trên đường đi để nó được hiểu rõ hơn. Làm thế nào chúng ta có thể học cách khác?

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