Пересечение строк в файле с использованием bash и переход к переменной. Результирующая переменная – это не то же значение, что и файл, почему?

У меня есть сценарий bash (просто выполняющий простой шаблон файла журнала), который я провел в cron в течение нескольких лет. Недавно он сломался и начал возвращать нечетные результаты. Покопавшись в скрипт и выполнив некоторую отладку, я обнаружил, что проблема связана с циклом while, который я делаю в файле.

Чтобы проиллюстрировать проблему, я сделал кошку в файле «cat / var / tmp / file» и получил то, что я ожидаю получить, это отметка времени и некоторые (неформатированные) идентификаторы:

15:56:14,965 [,PCC12345678(PSI12345678),,] 18:08:43,706 [,PCC23456789(PSI23456789),,] 12:01:49,233 [,PCC34567891(PSI34567891),,] 

Когда я помещаю это в цикл while, я ожидаю, что он останется прежним, но это не так. Когда я повторяю строку в цикле, второе поле (идентификаторы) всегда изменяется на «1», например:

 cat /var/tmp/file | while read line do echo $line done 

Это дает мне результат:

 15:56:14,965 1 18:08:43,706 1 12:01:49,233 1 

Очевидно, что это совершенно другое отличие от того, что находится в файле, и я оставил меня озадаченным.

Вещи, которые я пробовал до сих пор:

  • Я подумал, что, возможно, переменная $ line застряла в памяти, поэтому попробовал очистить ее, не работал.
  • Я попробовал классику «выключить и снова включить» на сервер из-за отсутствия лучших идей, думающих, возможно, это очистит все, что могло застрять.
  • Пробовал запустить скрипт на двух других серверах, получил ту же проблему.

В настоящее время я думаю, может быть, это не нравится формат файла, возможно, что-то связанное с квадратными скобками или запятыми. Хотя я не уверен, почему это так, или почему это внезапно произойдет.

Примечание. Ничего не изменилось ни на сценарии, ни на файлах журнала, с которыми он работает, начиная с момента написания. Он работал уже два года.

Изменить: после предложений я проверил, что может измениться в среде, насколько я могу сказать то же самое. Если что-то не изменилось при обновлении ОС (что я не знаю, как проверить):

  • .bash_profile и .profile не редактировались более трех лет.
  • Я попытался запустить скрипт в других оболочках ksh, bash, csh. Такая же проблема встречается во всех них.
  • Я попытался запустить скрипт с другими пользователями, включая root. Снова такая же проблема со всеми из них.

Спасибо Мэтту

У вас есть файл с именем 1 в каталоге, в котором запущен скрипт.

Как отметил Мельбурслан , [] имеет особое значение для оболочки, но это не имеет большого отношения к регулярным выражениям: это просто означает «один символ, взятый из любого символа между скобками». Поэтому, когда вы запускаете

 echo 15:56:14,965 [,PCC12345678(PSI12345678),,] 

оболочка ищет файл с именем [,PCC12345678(PSI12345678),,] или P , или C , или 1 … Если по крайней мере один файл соответствует, [,PCC12345678(PSI12345678),,] заменяется всеми соответствующими именами файлов на выходе; иначе он воспроизводится как есть.

Если вы удалите 1 файл, нужно восстановить прежнее поведение. Вы можете исправить скрипт, защитив $line :

 cat /var/tmp/file | while read line do echo "$line" done