2013-08-28 24 views
5

Im cố gắng grep cho tên tệp có đường dẫn đầy đủ trong tệp chứa thứ gì đó như đầu ra 'ls -l', nhưng không khớp với nó đúng.Kết hợp từ chính xác grep (-w) không hoạt động với đường dẫn tệp trong tệp văn bản

dòng trong kịch bản shell mà không tìm kiếm chuỗi

pcline=`grep -w "$file1" $file2` # grep for file1 in file2 contents 

nếu tôi hiển thị các lệnh, đầu ra của lệnh trông giống như dưới đây

grep -w run /home/rajesh/rootfs.layout 

Expected 
lrwxrwxrwx 1 root root 3 Aug 28 run 

Actual 
lrwxrwxrwx 1 root root 7 Aug 28 bin/run-parts 
lrwxrwxrwx 1 root root 3 Aug 28 run 
-rwxr-xr-x 1 root root 303 Aug 28 tests/aes/run.sh 
-rwxr-xr-x 1 root root 445 Aug 28 tests/auto_ui/run.sh 
-rwxr-xr-x 1 root root 320 Aug 28 tests/available_memory/run.sh 
-rwxr-xr-x 1 root root 308 Aug 28 tests/fonts/run.sh 
-rwxr-xr-x 1 root root 309 Aug 28 tests/html_config_page/run.sh 
-rwxr-xr-x 1 root root 361 Aug 28 tests/ipc/run.sh 
-rwxr-xr-x 1 root root 304 Aug 28 tests/JSON/run.sh 
-rwxr-xr-x 1 root root 303 Aug 28 tests/log4cplus_cpp/run.sh 
-rwxr-xr-x 1 root root 301 Aug 28 tests/log4cplus_c/run.sh 
-rwxr-xr-x 1 root root 751 Aug 28 tests/msm_basic/run.sh 
-rwxr-xr-x 1 root root 472 Aug 28 tests/res_man_dependency/run.sh 
-rwxr-xr-x 1 root root 465 Aug 28 tests/res_man_ipc/run.sh 
-rwxr-xr-x 1 root root 789 Aug 28 tests/res_man_multi_process/run.sh 
-rwxr-xr-x 1 root root 469 Aug 28 tests/res_man_private_client/run.sh 
-rwxr-xr-x 1 root root 492 Aug 28 tests/res_man_public_client/run.sh 
-rwxr-xr-x 1 root root 311 Aug 28 tests/virt_mem_config/run.sh 
lrwxrwxrwx 1 root root 6 Aug 28 var/run] 

Bí quyết tôi đã cố gắng là thêm một màu trắng không gian, được đảm bảo trong tệp đầu vào của tôi, điều này hoạt động trong bảng điều khiển, nhưng không phải khi được gán cho một biến.

grep " tests/aes/run.sh" /home/rajesh/rootfs.layout 

dòng trong kịch bản

pcline=`grep \"" $file1"\" $file2`  # grep for file1 in file2 contents 

Xin vui lòng cho tôi biết nếu tôi đã cam kết bất kỳ lỗi nào trong kịch bản này.

+0

Tại sao kết quả không mong muốn đó? Một từ được giới hạn bởi một ký tự không phải chữ số. Vì vậy, 'grep -w run ...' sẽ khớp với một dòng với 'foo.run.bar', ví dụ. Bạn đã thử 'pcline = \' grep "$ file1" $ file2 \ '' không có dấu trích dẫn thoát? – lurker

+0

@mbratch, xin lỗi nó không hoạt động với => pcline = 'grep" $ filename "$ pc_layout' – rajeshk

+0

Thú vị. Tôi giả sử rằng có điều gì khác trong kịch bản của bạn không hiển thị trong bài đăng của bạn. Nó làm việc cho tôi khi tôi chạy một trường hợp thử nghiệm, nhưng có vẻ như bạn đã nhận được một giải pháp rồi. Mát mẻ. – lurker

Trả lời

1

Bạn có thể sử dụng egrep như thế này:

egrep "(^|)$file1(|$)" "$file2" 

Nếu file1="run" sau đó trên lệnh sẽ phù hợp với chuỗi run trước bởi sự khởi đầu dòng hoặc không gian và sau đó là không gian hoặc cuối dòng.

+0

nó hoạt động tốt với tất cả các tệp ngoại trừ hai tệp, nhưng chúng trông giống như các tệp lạ đối với tôi. 1) lrwxrwxrwx 1 root root 17 Aug 28 usr/bin/[ 2) lrwxrwxrwx 1 root root 17 Aug 28 usr/bin/[[ – rajeshk

+0

kết quả giống như thế này egrep: Unmatched [hoặc [^ – rajeshk

+0

Có vì '[' là thực sự là một tên tập tin trong '/ usr/bin' tôi sẽ thấy cách tôi có thể cung cấp cho bạn một cách giải quyết trong vài phút. – anubhava

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