2013-11-16 4 views
1

Во-первых, я очень плохо раковине, как вы увидите :)Shell - сохранение содержимого файла в переменную, то выводя переменную

Итак, я следующая задача: Сценарий получает два arguments (fileName, N). Если количество строк в файле больше, чем N, тогда мне нужно вырезать последние N строк, а затем перезаписать содержимое файла.

Я думал о сохранении содержимого файла в переменной, а затем просто о том, что касается этого файла. Однако по какой-то причине он не работает.

У меня проблемы с сохранением последних N строк переменной.

Это, как я пытался сделать это:

lastNLines=`tail -$2 $1` 
cat $lastNLines > $1 
+0

Возможно, я неправильно понял, но не 'tail -n N inFile> outFile' будет достаточно хорош? – pfnuesel

+0

@pfnuesel проблема заключается в том, что OP хочет перезаписать тот же файл, который он читает. – shx2

+0

'tail -n N inFile> outFile && mv outFile inFile' – pfnuesel

ответ

1

Аргументы cat принимает имена файлов, а не содержание.

Вместо этого, вы можете использовать временный файл, например:

tail -$2 $1 > $1._tmp 
mv $1._tmp $1 

Чтобы сохранить содержимое в переменную, вы можете делать то, что вы уже включены в ваш вопрос, или:

lastNLines=`cat $1` 

(после mv команда, конечно)

+0

Хорошо, и как насчет сохранения содержимого файла в переменной. –

+0

см. Мой обновленный ответ – shx2

2

Ваш lastNLines не является именем файла. cat принимает имена файлов. Вы также не можете открыть входной файл для записи, потому что оболочка обрезает его до того, как tail сможет его получить, поэтому вам нужно использовать временный файл.

Однако, если вы настаиваете на не используя временный файл, вот непереносимой решение:

tail -n$2 $1 | sponge $1 

Вам может понадобиться установить moreutils для sponge.

+0

Это мошенничество, и Szabo, скорее всего, не установит его ... –

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