Reading file linux shell

Команда read в Bash

Bash поставляется с рядом встроенных команд, которые можно использовать в командной строке или в сценариях оболочки.

В этой статье мы рассмотрим встроенную команду read .

Встроенное read Bash

read — это встроенная команда bash, которая считывает строку из стандартного ввода (или из файлового дескриптора) и разбивает строку на слова. Первое слово присваивается первому имени, второе — второму имени и так далее.

Общий синтаксис встроенной функции read имеет следующий вид:

Чтобы проиллюстрировать, как работает команда, откройте терминал, введите read var1 var2 и нажмите «Enter». Команда будет ждать, пока пользователь введет данные. Введите два слова и нажмите «Enter».

read var1 var2Hello, World!

Слова присваиваются именам, которые передаются команде read качестве аргументов. Используйте echo или printf чтобы проверить это:

Вместо того, чтобы вводить текст на терминале, вы можете передать стандартный ввод для read с помощью других методов, таких как piping, here-string или heredoc :

echo "Hello, World!" | (read var1 var2; echo -e "$var1 n$var2")

Вот пример использования строки здесь и printf :

read -r var1 var2 printf "var1: %s nvar2: %sn" "$var1" "$var2"

Если команде read не задан аргумент, вся строка присваивается переменной REPLY :

echo "Hello, world!" | (read; echo "$REPLY")

Если количество аргументов, предоставленных для read , больше, чем количество слов, прочитанных из ввода, оставшиеся слова присваиваются фамилии:

echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 nVar2: $var2")
Var1: Linux Var2: is awesome. 

В противном случае, если количество аргументов меньше количества имен, оставшимся именам присваивается пустое значение:

echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 nVar2: $var2 nVar3: $var3")
Var1: Hello, Var2: World! Var3: 

По умолчанию read интерпретирует обратную косую черту как escape-символ, что иногда может вызывать неожиданное поведение. Чтобы отключить экранирование обратной косой черты, вызовите команду с параметром -r .

Ниже приведен пример, показывающий, как работает read при вызове с параметром -r и без него:

Как правило, вы всегда должны использовать read с параметром -r .

Изменение разделителя

По умолчанию при read строка разбивается на слова с использованием одного или нескольких пробелов, табуляции и новой строки в качестве разделителей. Чтобы использовать другой символ в качестве разделителя, присвойте его переменной IFS (внутренний разделитель полей).

echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 n$var2 n$var3")

Когда IFS установлен на символ, отличный от пробела или табуляции, слова разделяются ровно одним символом:

echo "Linux::is:awesome." | (IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 nVar2: $var2 nVar3: $var3 nVar4: $var4")

Строка разделена четырьмя словами. Второе слово — это пустое значение, представляющее отрезок между разделителями. Он создан, потому что мы использовали два символа-разделителя рядом друг с другом ( :: .

Var1: Linux Var2: Var3: is Var4: awesome. 

Для разделения строки можно использовать несколько разделителей. При указании нескольких разделителей присваивайте символы переменной IFS без пробела между ними.

Вот пример использования _ и - качестве разделителей:

echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 n$var2 n$var3")

Строка подсказки

При написании интерактивных сценариев bash вы можете использовать команду read для получения пользовательского ввода.

Чтобы указать строку приглашения, используйте параметр -p . Подсказка печатается перед выполнением read и не включает новую строку.

Как правило, вы будете использовать для read команды внутри в while цикл , чтобы заставить пользователя дать один из ожидаемых ответов.

Приведенный ниже код предложит пользователю перезагрузить систему :

while true; do read -r -p "Do you wish to reboot the system? (Y/N): " answer case $answer in [Yy]* ) reboot; break;; [Nn]* ) exit;; * ) echo "Please answer Y or N.";; esac done 

Если сценарий оболочки просит пользователей ввести конфиденциальную информацию, например пароль, используйте параметр -s который сообщает read не печатать ввод на терминале:

read -r -s -p "Enter your password: " 

Назначьте слова в массив

Чтобы присвоить слова массиву вместо имен переменных, вызовите команду read с параметром -a :

read -r -a MY_ARR  "Linux is awesome." for i in "$MY_ARR[@]>"; do echo "$i" done 

Когда даны и массив, и имя переменной, все слова присваиваются массиву.

Выводы

Команда read используется для разделения строки ввода на слова.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Shell how to read a file in linux

Script #!/bin/bash ## join ## version 0.0.2 - fix recursion parameters ################################################## join ( ) < < local indelimiter; indelimiter = " $" ; local outdelimiter; outdelimiter = " $ " ; > local car local cdr local IFS IFS = " $ " read -t 1 car cdr || return test " $ " || < echo " $" ; return ; > echo " $ $ $ " | $ " $ " " $ " > ################################################## ## generated by create-stub2.sh v0.1.2 ## on Mon, 17 Jun 2019 12:24:59 +0900 ## see ################################################## Source: join.sh Command line echo a b | join Output a.b Command line echo a b | join | join . " || return test " $ " || < true ; return ; >$ $ echo " $ " | $ " $ " > ################################################## ## generated by create-stub2.sh v0.1.2 ## on Tue, 18 Jun 2019 08:33:49 +0900 ## see ################################################## Source: map.sh Commands pow ( ) < local -i i = $; echo $ ( ( i ** 2 ) ) ; > echo < 1 .. 10 >| map pow Output 1 4 9 16 25 36 49 64 81 100 Filter function using read Suppose we want a filter function that takes a list and returns a sublist of elements satifying conditions set by another function.

How to read a file in shell script

perhaps you want to write it this way

$ if grep -q keyword jeeva/sample/logs.txt; then echo "found"; else echo "not found"; fi 

-q option is to suppress the output when the keyword is found.

This will read a file into a variable

some_var=$(cat jeeva/sample/logs.txt) 

But you don't need to do that. You only want to check for the word "keyword", so you can just

grep keyword jeeva/sample/logs.txt 

In a script if that is found then $? will equal 0 , otherwise it will equal 1 .

grep keyword jeeva/sample/logs.txt if ! [[ $? ]] then echo found else echo "not found" fi 

I guess you just need to monitor some tagged log messages. How about:

tail -fn 1000 youFile.log | grep yourTag 

Tail seems to be better in this case because you don't need to rerun it.

If you need script try this one:

#!/bin/bash while IFS='' read -r line || [[ -n "$line" ]]; do if [[ $line == *"$2"* ]]; then echo "Do sth here."; echo "Like - I've found: $line"; fi done < "$1" 

$1 is a file $2 is your tag

➜ generated ./script.sh ~/apps/apache-tomcat-7.0.67/RUNNING.txt UNIX Do sth here. Like - I've found: access to bind under UNIX. 

Count Lines in a File in Bash, The wc command is used to find the number of lines, characters, words, and bytes of a file. To find the number of lines using wc, we add the -l

Shell Scripting Tutorial for Beginners 17

done bash loop to read file line by line on a Linux, OSX, or Unix-like system. There are Duration: 7:21

Shell Basics - Read and Write to Files

http://filmsbykris.comFor help: http://filmsbykris.com/ircFaceBook: https://www.facebook.com/pages
Duration: 10:49

Shell Scripting Tutorial-47: Reading From a File

In this tutorial you'll learn to use the exec command to change the default input stream from the Duration: 8:46

Bash read command

Read or die friends. The read command is just as important as positional parameters and the echo command. How else are you going to catch user input, accept passwords, write functions, loop, and peek into file descriptors? Read on.

What is read?

Read is a bash builtin command that reads the contents of a line into a variable. It allows for word splitting that is tied to the special shell variable ifs. It is primarily used for catching user input but can be used to implement functions taking input from standard input.

Bash read builtin command help

Before we dive into how to use the read command in bash scripts, here is how we get help. There you should see all the options available for the read command along with descriptions that we will try to cover in the examples.

Command line

read: read [ -ers ] [ -a array ] [ -d delim ] [ -i text ] [ -n nchars ] [ -N nchars ]
[ -p prompt ] [ -t timeout ] [ -u fd ] [ name . ]

Read a line from the standard input and split it into fields.

Reads a single line from the standard input, or from file descriptor FD
if the -u option is supplied. The line is split into fields as with word
splitting, and the first word is assigned to the first NAME, the second
word to the second NAME, and so on, with any leftover words assigned to
the last NAME. Only the characters found in $IFS are recognized as word
delimiters.

If no NAMEs are supplied, the line read is stored in the REPLY variable.

Options:
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
-d delim continue until the first character of DELIM is read , rather
than newline
-e use Readline to obtain the line in an interactive shell
-i text use TEXT as the initial text for Readline
-n nchars return after reading NCHARS characters rather than waiting
for a newline, but honor a delimiter if fewer than

NCHARS characters are read before the delimiter
-N nchars return only after reading exactly NCHARS characters, unless
EOF is encountered or read times out, ignoring any
delimiter
-p prompt output the string PROMPT without a trailing newline before
attempting to read
-r do not allow backslashes to escape any characters
-s do not echo input coming from a terminal
-t timeout time out and return failure if a complete line of
input is not read within TIMEOUT seconds. The value of the
TMOUT variable is the default timeout. TIMEOUT may be a
fractional number. If TIMEOUT is 0 , read returns
immediately, without trying to read any data, returning
success only if input is available on the specified
file descriptor. The exit status is greater than 128
if the timeout is exceeded
-u fd read from file descriptor FD instead of the standard input

Exit Status:
The return code is zero, unless end-of-file is encountered, read times out
( in which case it 's greater than 128), a variable assignment err

Catching user input

Interactive bash scripts are nothing without catching user input. The read builtin provides methods that user input may be caught within a bash script.

Catching a line of input

To catch a line of input NAMEs and options are not required by read. When NAME is not specified, a variable named REPLY is used to store user input.

Catching a word of input

To catch a word of input, the -d option is required. In the case of a word we would set -d to a space, read ‘-d ‘. That is when the user presses the space bar read will load REPLY with the word.

Note that when the -d option is set, the backspace does not work as expected. To backspace, while trying to catch a word of input, the -e option may be used, read -e ‘-d ‘.

Prompt user

In interactive bash scripts prompting a user may require a message to tell the user what input is expected. We can always accomplish this using the echo builtin. However, it turns out there is an option using read.

Prompt user for a word

In catching a word of input, we used echo to write Type something and hit space: to standard output before read ‘-d ‘. The -p option allows a message to be displayed before reading from standard input.

Prompt user for a secret

When catching user input without it showing up int the terminal, the -s option comes in handy. read -s -p allows you to catch and hide user input as follows.

<
read -s -p 'Type something I promise to keep it a secret: '
echo "" ;
echo "Your secret is safe with me" ; unset REPLY ;
echo " $ "
>

Functions using read

Here are examples of functions in bash that use read and standard input

Core concept

Functions using read make use of piped standard input and parameters. Main input to be process such as lines in a file are passed in through standard input via a pipe. Other input if-any and option are passed in as parameters.

read is a builtin command

-t 1 prevent the bash script from waiting indefinitely for a line to be returned through standard input. If standard input is initially empty, the function returns with an exit code of 142 signifying that no date was read within the set timeout period

NAME1 NAME2 are variable names

. many variable names may be listed

Now that the groundworks are set, let’s see what familiar functions look like implemented using read.

Join function using read

Suppose we want a join function that takes a list of words and returns another list of words joined by a delimiter. Here is how we may implement a join function using read.

Source: join.sh
Command line

Источник

Читайте также:  Linux debian stable amd64
Оцените статью
Adblock
detector