2016-09-19 1 views
0

У меня есть эта линияКоманда производит различные результаты в командной строке в сравнении файл сценария

grep -n -m7 '\$' myfile.asm | tail -n 1 | awk -F':' '{print $1}' 

Который производит этот выход:

27 

Я хотел использовать его в сценарий, который редактирует файл. Так что я сделал это в myscript.ksh:

fileName=$1 
.... 
lastLine=`grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}'` 
.... 
echo ${lastLine} 

Когда я делаю это ожидаемое значение 27 в lastLine только 7. Вот первые 30 строк файла, с которым я работаю.

$*********************************************************************** 
$ THE FOLLOWING BULK DATA ENTRIES RELATED TO EXT. SUPERELEMENT  5000 
$ ARE FOR USE IN THE MAIN BULK DATA PORTION OF THE ASSEMBLY RUN 
$*********************************************************************** 
$ 
SEBULK  5000EXTOP2   MANUAL      12 
$ 
SECONCT  5000  0    NO 
      60582 60582 180021 180021 180023 180023 180057 180057 
      180941 180941 180942 180942 180943 180943 180944 180944 
      180946 180946 180947 180947 204499 204499 231050 231050 
      231060 231060 232050 232050 232060 232060 252300 252300 
      252301 252301 253072 253072 253073 253073 401101 401101 
      401102 401102 401103 401103 401104 401104 402101 402101 
      402102 402102 402103 402103 402104 402104 403101 403101 
      403102 403102 403103 403103 403104 403104 404101 404101 
      404102 404102 404103 404103 404104 404104 405101 405101 
      405102 405102 405103 405103 405104 405104 406101 406101 
      406102 406102 406103 406103 406104 406104 407101 407101 
      407102 407102 407103 407103 407104 407104 408101 408101 
      408102 408102 408103 408103 408104 408104 631050 631050 
      631060 631060 632050 632050 632060 632060 652300 652300 
      652301 652301 653072 653072 653073 653073 662050 662050 
      662060 662060 677500 677500 677600 677600 678516 678516 
      678622 678622 679514 679514 679620 679620 703077 703077 
      703078 703078 1184100 1184100 1184200 1184200 1184400 1184400 
$ 
CORD2C*   220102   220104 0.000000000E+00 0.000000000E+00 
*  0.000000000E+00 0.000000000E+00 0.000000000E+00 0.100000000E+01 
*  0.100000000E+01 0.900000000E+02 0.100000000E+01 

То, что я пытаюсь сделать, это скопировать SECONCT запись из этого файла в другой на данном этапе. Я знаю, что начинается с SECONCT и заканчивается 7-м номером $. Как я уже сказал, это работает в командной строке, но не в скрипте. Если я использую «`»оператор в командной строке я получаю эту ошибку:

-ksh: 7: not found [No such file or directory]

Так что это связанно с этим оператором, но я никогда не имел эту проблему раньше. Как это исправить?

Update: Я побежал с set -x здесь выход:

+ grep -n -m7 '$' sq93a3mkop2_4hz.asm 
+ awk -F: '{print $1}' 
+ tail -n 1 
+ lastLine=7 

Ошибка из \$ читается как $. Но как мне это исправить?

+1

Чтобы отладить сценарии оболочки, поместите 'set -x' в начале. Затем вы увидите все исполняемые команды с заполненными переменными. Это обычно помогает. – Barmar

ответ

1

Я думаю, что вы чрезмерны.

Это гораздо более простой способ вывода, который раздел:

sed -n '/SECONCT/,/^\$$/p' myfile.asm 

Я не установлен КШ, но это работает под CSH.

. Пояснение:

  • "-n" - СЭД будет печатать только то, что вы заинтересованы в
  • "/ SECONCT /" - Запуск при появлении SECONCT линии.
  • "/^\ $$ /" - Остановитесь, когда появится следующая строка с "$".
  • «p» - печатать все между двумя шаблонами, включительно.
+0

Спасибо, что я, безусловно, был слишком усложняющим. Вот как я учился. – Matt

1

Остановить использование `backticks`. Используйте $(..) вместо:

lastLine=$(grep -n -m7 '\$' ${fileName}.asm | tail -n 1 | awk -F':' '{print $1}') 

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

$ echo '\$' 
\$ 

$ echo "`echo '\$'`" # Working command produces different results in backticks 
$ 

$ echo "`echo '\\$'`" # ... and requires another layer of escaping. 
\$ 

$ echo "$(echo '\$')" # $() just works. 
\$ 

Современной подстановки команд, $(..), не имеет эти проблемы и позволяют обменивать немодифицированные команды. $(..) - это POSIX, поэтому нет оснований когда-либо использовать backticks.

+0

[Ссылка на дополнительную информацию] (http://mywiki.wooledge.org/BashFAQ/082) –

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