Я должен поместить в переменную bash первую строку файла. Я думаю, что это с командой grep, но есть ли способ ограничить количество строк?
249
head
берет первые строки из файла, и -n
параметр может использоваться, чтобы указать, сколько строк должно быть извлечено:
line=$(head -n 1 filename)
read
подход.$()
разветвляется на подоболочку, и использование внешней команды ( любой внешней команды) означает, что вы звонитеexecve()
, вызываете компоновщик и загрузчик (если он использует разделяемые библиотеки, как это обычно бывает) и т. д.line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
открытия подоболочку$()
?$()
синтаксис легче увидеть и ценит ясность, а не абсолютную краткость. gnu.org/software/bash/manual/html_node/…чтобы прочитать первую строку, используя bash, используйте
read
оператор. напримерfirstline
будет вашей переменной (нет необходимости назначать другим)источник
cat ... | read VAR
потерпит неудачу в большинстве оболочек (все, кромеzsh
насколько я знаю), потому что каждый из компонентов в трубе будет работать в отдельных подоболочках. Это означает, что$VAR
он будет установлен в подоболочке (которая перестает существовать, как только закончится выполнение конвейера), а не в вызывающей оболочке. Вы можете обойти это сread VAR <<EOF\n$(cat ...)\nEOF
(где каждый\n
является новой строкой).cat
чисто накладные расходы; гораздо эффективнее,read -r var <file
чем вcat file | read
любом случае, даже если последний не потерпел неудачу по причинам, описанным в BashFAQ # 24 .cat
read -r var < <(otherprog ...)
Этого достаточно и сохраняет первую строку
filename
в переменной$line
:Мне тоже нравится
awk
за это:Чтобы сохранить саму строку, используйте
var=$(command)
синтаксис. В этом случаеline=$(awk 'NR==1 {print; exit}' file)
.Или даже
sed
:С эквивалентом
line=$(sed -n '1p' file)
.Смотрите образец , когда мы кормить
read
сseq 10
, то есть последовательность чисел от 1 до 10:источник
sed '1!d;q'
(илиsed -n '1p;q'
) подражает вашейawk
логике и предотвратит дальнейшее чтение в файл. Потому что мы только хотим первую строку, мы можем в качестве альтернативы обмануть сsed q
илиawk '1;{exit}'
дажеgrep -m1 ^
(меньше кода, так же важно логика). (Это не ответ на запрос о понижении голосов.)grep
очень умным. Мы можем, конечно, также сказатьhead -n 1 file
.head -n1
будет быстрее (меньший двоичный файл для загрузки) иread
будет самым быстрым (без двоичного файла для загрузки, это встроенный). Мне особенно нравится,grep -m1 --color .
когда я просто печатаю первую строку, потому что она также будет окрашивать линию, что отлично подходит для заголовков таблиц.Будет работать нормально. (Как и предыдущий ответ). Но
будет немного быстрее, чем
read
встроенная команда bash.источник
read
ничего не печатает (поэтомуline
он пуст), а также выполняется в подоболочке (поэтомуFIRSTLINE
устанавливается в первую строку, но только в подоболочке, поэтому он не доступен позже). Решение: просто используйтеread -r line <filename
Просто
echo
первый список вашего исходного файла в целевой файл.источник
head -n 1 source.txt > target.txt
сделаю точно так же.Вопрос не задавался, какой самый быстрый, но, чтобы добавить к ответу sed, -n '1p' плохо работает, так как пространство шаблона все еще сканируется на больших файлах. Из любопытства я обнаружил, что «голова» побеждает узко:
источник