2015-05-31 5 views
6

У меня проблема с grep. У меня есть файл http://pastebin.com/HxAcciCa, который я хочу проверить для определенных шаблонов. И когда я "пытаюсь искать для него Grep возвращает все строки при условии, что модель уже существует в данном файле.Почему grep соответствует всем строкам независимо от того, какой шаблон

Чтобы объяснить более это код, который я бегу

grep -F "ENVIRO" "$file_pos" >> blah  

Нет . неважно, что еще я стараюсь, даже если я обеспечиваю всю линию как шаблон Баш всегда возвращает все строки
Эти вариант того, что я пытаюсь:

grep -F "E20" "$file_pos" >> blah 
grep E20 "$file_pos" >> blah 
grep C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah 
grep -F C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah 

Кроме того, для некоторых странных причин при добавлении - x для grep, it не возвращает никакой линии, несмотря на то, что существует точная модель.

Я искал в Интернете и документацию bash по причине, но ничего не мог найти.

Мой последний тест был следующим

grep -F -C 1 "E20" "$store_pos" >> blah #store_pos has the same value as $file_pos 

Я думал, может быть, это была печать строки после результата, но это было не так. Я использовал файл blah, чтобы увидеть результат. Также я использую Linux mint rebecca. Наконец, хотя именование довольно знакомо, этот вопрос не похож на Why does grep match all lines for the pattern "\'"

И, наконец, я хотел бы сказать, что я новичок в bash. Я подозреваю Ошибка может быть связана с главным файлом http://pastebin.com/HxAcciCa, а не с кодом?

+1

Вы присоединяетесь к 'блаху'. Где часть, где вы усекаете ее, чтобы она была пустой? –

+1

Такие вещи, как 'grep -F C: \ E20-II \ ENVIRO \ SSNHapACS480.dll" $ file_pos "' не могут работать, обратные косые черты должны быть экранированы или кавычки, если вы хотите, чтобы они были переданы в grep. Итак: 'grep -F 'C: \ E20-II \ ENVIRO \ SSNHapACS480.dll'" $ file_pos ". И это можно комбинировать с '-x'. Но эта проблема должна иметь обратный эффект: у вас не должно быть совпадений, а не каждой строки в качестве соответствия. – hvd

+1

проблема с окончанием строки в файле? проверьте hexdump или 'cat -vET filename'. –

ответ

2

Из комментариев видно, что в файле есть каретки, ограничивающие линии, а не линии, которые grep ожидает; в результате grep видит файл как одну огромную линию, которая либо совпадает, либо не совпадает с целым.

(Примечание: Есть по крайней мере три различных соглашения о том, как разграничить строки в «обычный текст» Файл - Unix использует перевод строки (\n), DOS/Windows использует возврат каретки с последующим переводом строки (\r\n), и предварительно OSX версии MacOS используется только возврат каретки (\r))

Я не ясно, о том, как ваш файл оказался в этом формате, но вы можете исправить это легко с:.

tr '\r' '\n' <badfile >goodfile 

или на лету с:

tr '\r' '\n' <badfile | grep ... 
+0

Спасибо, что решили. Один вопрос, хотя почему кошка читала «\ r» как^M, а не «\ r»? – user1544624

+1

@ user1544624: Существует множество различных соглашений для представления непечатаемых символов. '\ r' (для« Return ») - это соглашение на языке C, которое довольно широко используется. Другие, с которыми вы можете столкнуться, включают '^ M' (поскольку возврат каретки - это Control-M в коде ASCII),' '(для возврата каретки),' \ 015' (код символа ASCII в восьмеричном) и, возможно, другие I «Не думаю о небрежности. –

2
  1. Проверьте окончания строки в исходном файле: file, wc -l.
  2. Проверьте, действительно ли вы используете правильный grep: which grep.
  3. Используйте >, чтобы перенаправить вывод, или | more или | less, чтобы не путать предыдущие попытки, к которым вы добавляете.

Редактировать: Похоже, что ваш файл имеет неправильные окончания строки (возможно, старая Mac OS (CR)). Если у вас есть dos2unix, вы можете попробовать конвертировать их в конец строки стиля Unix (LF).

+0

Пожалуйста, просмотрите мои комментарии о wc -l, также я использую правый grep i.e/bin/grep – user1544624

+1

Если у вас есть dos2unix> = 7.1, вы можете проверить разрывы строк. $ dos2unix -i HxAcciCa.htm 369 125 0 no_bom текст HxAcciCa.htm Как я вижу, файл имеет 369 DOS разрывы строк, 125 разрывов Unix строки и 0 Mac разрывы строк. Если вы случайно преобразовали файл в разрывы строк в Mac, используйте команду mac2unix, чтобы преобразовать ее обратно в формат Unix. –

1

У меня нет доступа к ПК в настоящий момент, но что может помочь вам устранить неполадку: 1. Используйте grep --color -F, чтобы убедиться, что он правильно соответствует. 2. После вашего заявления используйте | cat -A, чтобы увидеть, есть ли какие-нибудь удивительные контрольные символы, строки должны заканчиваться на $, любые другие символы, такие как \ I или \ M, иногда могут быть головной болью.

Я подозреваю, что номер 2 выглядит как выход Windows. В этом случае вы можете cat filename | dos2unix | grep stmt должен решить эту проблему

Вы сохранили вывод dos2unix в качестве другого файла? Просто дважды проверьте файл, он должен быть похож на это:

[[email protected] ~]# cat -A Test.txt 
Windows^M$ 
Style^M$ 
Files^M$ 
Are^M$ 
Hard ^M$ 
To ^M$ 
Parse^M$ 


[[email protected] ~]# dos2unix Test.txt 
dos2unix: converting file Test.txt to Unix format ... 

[[email protected] ~]# cat -A Test.txt 
Windows$ 
Style$ 
Files$ 
Are$ 
Hard$ 
To$ 
Parse$ 

Теперь он должен разобрать правильно - так что просто убедитесь, что он сделал преобразовать файл правильно Удачи!

+0

Поскольку каждая строка заканчивается символом^M, это означает, что формат является mac? Я пробовал dos2unix, но он didn ' ничего не меняйте. – user1544624

+1

^M означает возврат каретки, типичный для файлов Windows. Поэтому, возможно, сначала запустите имя файла dos2unix, чтобы преобразовать его в стиль * nix, а затем повторите попытку.Возможно, dos2unix также не установлен в вашей системе, что делает двухэтапный процесс хорошим тестом – Werner

+0

Я использовал dos2unix, но это не помогло. счет новой строки по-прежнему равен 0. – user1544624

Смежные вопросы