невозможно хранить несколько операций sed с использованием pipe в переменной - PullRequest
0 голосов
/ 02 июня 2011

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

код выглядит так:

for i in 1 2 3 4 5 6 7
do
  for j in F E I D
  do
  cpath="`sed -n "11,11p" <path.cfg | sed -n 's/voicex/voice'$i'/g; s/voicecolx/voicecol'$i'/g; s/" F "/" '$j' "/g;P'`"
  echo $cpath
   more $cpath 2>error.log | grep " '&j' " | wc -l | echo "The count of '$j' in file is: " `wc -l` 1>countdir/count$j.txt
  done
done

я сохранил этот файл в stest.sh. Когда я запускаю файл, ничего не происходит. Я должен нажать Ctrl + C, чтобы вернуться в командную строку.

Позвольте мне также предоставить файл path.cfg:

MPAY
/var/xacct_data/xxxx/log_flattener/xxxx/logfile_current

FAFF
/var/xacct_data/faff/faff1/log_flattener/faffsnp1/ logfile_current
/var/xacct_data/faff/faff1/log_flattener/faffdbt1 /logfile_current
/var/xacct_data/faff/faff1/log_flattener/fafftxn1 /logfile_current
/var/xacct_data/faff/faff2/log_flattener/faffdbt2/ logfile_current

VOICE
/var/xacct_data/voice/voicex/log_flattener/ voicecolx/logfile_current
/var/xacct_data/voice/voicex/log_flattener/ voiceprox/logfile_current
/var/xacct_data/voice/voicex/log_flattener/ voicedisx/logfile_current

GPRS
/var/xacct_data/gprs/gprsx/log_flattener/gprscolx/logfile_current
/var/xacct_data/gprs/gprsx/log_flattener/gprsprox/logfile_current
/var/xacct_data/gprs/gprsx/log_flattener/gprsdisx/logfile_current

IPC
/var/xacct_data/ipc/ipcx/log_flattener/ipccolx/logfile_current
/var/xacct_data/ipc/ipcx/log_flattener/ipcprox/logfile_current
/var/xacct_data/ipc/ipcx/log_flattener/ipcdisx/logfile_current

SMS
/var/xacct_data/smsc/smscx/log_flattener/smsccolx/logfile_current
/var/xacct_data/smsc/smscx/log_flattener/smscprox/logfile_current
/var/xacct_data/smsc/smscx/log_flattener/smscdisx/logfile_current

1 Ответ

0 голосов
/ 02 июня 2011

Чтобы получить конкретный совет, вам нужно предоставить пример path.cfg, объяснить, что не так с поведением текущего сценария и каково ожидаемое поведение.При этом в вашем коде есть несколько красных флажков.

  • Используйте $(…) вместо `…` для подстановки команд.Разбор обратных кавычек довольно трудоемкий, и вы можете столкнуться с проблемами с вложенными кавычками.
  • sed -n "11,11p" означает вывод только 11-й строки.Это то, что вы действительно хотели?Наверное, нет, но, не зная ни формата path.cfg, ни того, что вы намеревались, я не могу сказать вам, какой должна быть эта команда.
  • Вы всегда должны использовать двойные кавычки вокруг подстановок переменных, например echo "$cpath".Оставляйте их только в том случае, если вы знаете, что иметь их было бы неправильно, ставьте их, если у вас нет веских оснований их опускать.Я не думаю, что это вызывает какие-либо проблемы, но это хорошая привычка при написании сценариев оболочки.
  • Почему вы звоните more?Ввод more в другую программу бесполезен.Просто напишите <"$cpath" grep " '&j' " | …, предполагая, что вы хотите отобразить все строки, содержащие строку '&F' (и т. Д. Для других значений $j) в файле с именем $cpath.
  • .grep PATTERN | wc -l можно просто записать grep -c PATTERN.
  • Все еще на этой строке вы запускаете wc -l на выходе wc -l, что бесполезно.Я предполагал, что ты хотел запустить его только один раз.Вот два способа написать эту строку;первая закрыта для вашей структуры, вторая более понятна:

    <"$cpath" grep -c " '&j' " | echo "The count of '$j' in file is:  $(cat)" >"countdir/count$j.txt"
    echo "The count of '$j' in file is:  $(<"$cpath" grep -c " '&j' ")" >"countdir/count$j.txt"
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...