2016-01-26 2 views
1

Это мой сценарий. Он печатает каждую строку в файле с номером строки. Далее я хочу прочитать, какая строка выбрана пользователем и сохранить ее для некоторой переменной.Как получить строку 'variable' из файла?

I=1 
    for ROW in $(cat file.txt) 
    do 
     echo "$I $ROW" 
     I=`expr $I + 1` 
    done 
    read var 
    awk 'FNR = $var {print}' file.txt 

Затем я хочу напечатать/сохранить выбранную строку в файл.

Как это сделать?

, когда i echo $var это показывает мне номер. Но когда я пытаюсь использовать эту переменную в awk, она печатает каждую строку.

Как читать строку 'var' из файла?

И кроме того, как сохранить эту строку в другой переменной?

Пример file.txt

1 line1 
2 line2 
3 line3 
4 line4 

когда я нажмите 3 я хочу прочитать третью строку из файла.

+1

Никогда не делайте этого: 'for x in $ (command)' или \ 'command \' или $ var. for-in используется для итерации аргументов, а не (выходных) строк. Вместо этого используйте glob (например. * .txt), массивы (например, «$ {names [@]}») или while-read цикл (например, при чтении строки -r). См. Http://mywiki.wooledge.org/BashPitfalls#pf1 и http://mywiki.wooledge.org/DontReadLinesWithFor –

ответ

1

Попробуйте это:

cat -n file.txt; read var; line="$(sed -n ${var}p file)"; echo "$line" 

С большим акцентом на версии Dryingsoussage в:

#!/bin/bash 

file="file.txt" 
declare -i counter=0 # set integer attribute 
var=0 

while read -r line; do 
    counter=counter+1 
    printf "%d %s\n" "$counter" "$line" 
done < "$file" 

# check for number and greater-than 0 and less-than-or-equal $counter 
until [[ $var =~ ^[0-9]+$ ]] && [[ $var -gt 0 ]] && [[ $var -le $counter ]]; do 
    read -p "Enter line number:" var 
done 

awk -v var="$var" 'FNR==var {print}' "$file" 
+0

Большое вам спасибо. Вот что я хочу получить :) – Dryingsoussage

+0

+1 для 'cat -n'. Но это не проверяет, что 'var' является непустым/не-злым/иначе действительным, прежде чем использовать его без кавычек в команде оболочки. –

+0

@EtanReisner: хорошо :) Я обновил свой ответ. – Cyrus

0

Первый: Вы не можете использовать $var в одиночных кавычках, поскольку echo '$ var' будет равным $ var, а не его значение.
Второй: вы использовали оператор = вместо оператора == (равенство).
В-третьих: Вам не нужно писать { print }, если вы хотите, чтобы линия была напечатана. Вместо этого вы ничего не можете писать.
Четвертое: как было объяснено в удаленном комментарии ниже - не разрешайте bash расширять переменные в коде awk-скрипта, поскольку это может привести к инъекции кода. Так вывод:

awk -v var="$var" 'FNR == var' file.txt 

должны делать то, что вы хотите.

+1

@EdMorton: Я вижу вашу точку. Я отредактировал свой ответ. – nsilent22

0
cat -n file.txt 
read var 
row="$(awk -v tgt="$var" 'NR==tgt{print;exit}' file.txt)" 
+0

Это показано в очереди просмотра «Низкие качественные сообщения», хотя это не так, может быть, вызвано только кодом? –

+0

Я одобрю это, но, возможно, автор может захотеть добавить какое-то объяснение. – rghome

+0

Нечего объяснять, это просто то, что он говорит, что это ... Не все ответы требуют дополнительного текста, а ИМХО - более простые, без него, поэтому читатель, который не понимает это, должен искать пару простые конструкции и больше узнают от того, что они кормят ложкой. –

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