2013-08-28 14 views
5

Próbuję grep dla nazwy pliku z fullpath w pliku, który zawiera coś w rodzaju "ls -l", ale nie pasuje do niego prawidłowo.Grep dokładne dopasowanie słowa (-w) nie działa ze ścieżkami plików w pliku tekstowym

Linia w skrypcie, który robi to ciąg wyszukiwania

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

gdybym echo polecenia, wyjście polecenia wygląda poniżej

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] 

Sztuką próbowałem jest dodanie białego spacja, która jest gwarantowana w moim pliku wejściowym, działa w konsoli, ale nie wtedy, gdy jest przypisana do zmiennej.

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

Linia w skrypcie

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

Proszę dać mi znać, jeśli popełniłem jakieś błędy w tym skrypcie.

+0

Dlaczego jest to nieoczekiwany wynik? Słowo jest ograniczone przez znak niealfanumeryczny. Więc 'grep -w run ...' na przykład dopasuje linię do 'foo.run.bar'. Czy wypróbowałeś 'pcline = \' grep "$ file1" $ file2 \ '' bez cytowanych escaped? – lurker

+0

@mbratch, przykro mi, że nie działało z => pcline = 'grep" $ filename "$ pc_layout' – rajeshk

+0

Interesujące. Przypuszczam, że w twoim scenariuszu jest coś jeszcze niewidocznego w twoim poście. Udało mi się, gdy uruchomiłem test, ale wygląda na to, że już otrzymałeś rozwiązanie. Chłodny. – lurker

Odpowiedz

1

Można użyć egrep takiego:

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

Jeśli file1="run" następnie Powyższe polecenie dopasuje łańcuch run poprzedzone początku wiersza lub przestrzeni a następnie przestrzeni lub na końcu wiersza.

+0

to działało dobrze z wszystkimi plikami oprócz dwóch, ale dla mnie wyglądają one dziwacznie. 1) lrwxrwxrwx 1 root root 17 sierpnia 28 usr/bin/[ 2) lrwxrwxrwx 1 root root 17 sierpnia 28 usr/bin/[[ – rajeshk

+0

wynik był podobny do tego egrep: Unmatched [lub [^ – rajeshk

+0

Tak, ponieważ '[' jest właściwie nazwa pliku w katalogu '/ usr/bin' Zobaczę, jak mogę zapewnić obejście w kilka minut. – anubhava

Powiązane problemy