- Как в BASH в переменную занести все содержимое текстового файла?
- 3 ответа 3
- как перенаправить вывод вызова системы CAT в переменную и проанализировать переменные данные
- как перенаправить вывод системного вызова CAT в переменную и проанализировать переменные данные
- Ответы (6)
- How to assign the cat output of a bash script to a variable in another script
- 2 Answers 2
- You must log in to answer this question.
- Related
- Hot Network Questions
- Subscribe to RSS
Как в BASH в переменную занести все содержимое текстового файла?
Как в BASH в переменную занести все содержимое текстового файл что бы потом можно было работать с этой переменной через substring? К примеру у меня есть файл text.txt в нем есть строки:
Hello im text now Im text, you know it Or not? I am Text Hi, how are you Text. How do you feel?
и так далее. мне нужно, если в строке есть слово «text» узнать какой по счету этот символ, и от него выделить определенное количество символов и записываю это в другой файл.
@кими Это задание из какого то курса или по работе? Вам Баракин дал наводку, что лучше оболочкой (bash в вашем случае) это не делать есть много верных инструментов для этого.
3 ответа 3
Мне нужно нужно, если в строке есть слово «text» узнать какой по счету этот символ, и от него выделить определенное количество символов и записываю это в другой файл.
т.е., фактически, вам надо получить несколько символов из строк, стоящих после text .
средствами оболочки (хоть программы bash, хоть любой другой) это сделать, конечно, можно, но получится довольно громоздко.
лучше воспользоваться программами, более подходящими для манипуляций с текстом.
для вашего примера команда выведет по 4 символа (стоящие после text ) из каждой строки, где встречается text :
сохранить stdout программы в другой файл:
$ программа опции и аргументы > другой.файл
как перенаправить вывод вызова системы CAT в переменную и проанализировать переменные данные
моя основная интенсивность состоит в том, чтобы извлечь только имя пользователя из файла /etc/passwd и сохранить его в списке массивов. Я могу отображать их по одному для этого. Я создал простой скрипт, как показано ниже.
#!/bin/bash cat "/etc/passwd" > OUTPUT echo -e $OUTPUT IFS=: read -ra ADDR "; do echo -e $i done
> cat /etc/passwd root:$1$L15vXdMd$SVx9qKAzHtLcqGN8n2SIc.:0:0:root:/:/bin/sh sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/bin/false super:x:1111:1100:Ldap user:/opt/www/usr/super:/bin/sh admin:x:1107:1100:Ldap user:/opt/www/usr/admin:/opt/www/jv/bin/cliInit.sh guest:x:1101:1100:Ldap user:/opt/www/usr/guest:/opt/www/jv/bin/cliInit.sh postgres:x:1000:1000:Linux User. /home/postgres:/bin/sh albert:x:1114:1100:Ldap user:/opt/wwwl/usr/albert:/opt/www/jv/bin/cliInit.sh ritesh112:x:1125:1001:RADIUS user:/opt/www/usr/ritesh112:/opt/dell/mc/bin/cliInit.sh
может быть, я делаю неправильный путь (вот почему я задаю вопрос) в приведенном выше сценарии. В соответствии с моей логикой сначала перенаправляет /etc/passwd на любую переменную ( cat «/etc/passwd» > OUTPUT не знает этого правильно или неправильно Также, как альтернатива, попробовали read -ra ADDR
Я ожидаю, что вывод скрипта будет следовать за исключением имен sshd и postgres .
root super admin guest albert ritesh112
Но это не работает, у кого есть идея?
Не сохраняйте вывод в переменной/массиве (в некоторых случаях вы можете получать всевозможные проблемы с буферизацией – хотя и не с /etc/passwd, и просто нет необходимости), просто сделайте что-то вроде синтаксического анализа строки за строкой или используйте инструмент, такой как awk или cut, как рекомендуется
#!/bin/bash while read -r line; do echo "$" done < /etc/passwd
$ удалит удаление самого длинного совпадения суффикса :* , что означает все после первого и следующего :
Чтобы получить массив, вы можете просто изменить его (также обратите внимание, не включая postgres и sshd в массиве. Количество способов сделать это, но здесь должно быть достаточно хорошо)
#!/bin/bash while read -r line; do [[ "$" != postgres && "$" != sshd ]] && arr+=("$") done < /etc/passwd for i in "$"; do echo -e "$i" done
Или сделать что-то вроде подстановки команд (но опять же, это не лучшая практика в большинстве случаев)
Не создает переменную, она просто копирует файл /etc/passwd в файл с именем OUTPUT . Чтобы получить содержимое в переменной, вы можете попробовать OUTPUT=$(cat/etc/passwd) .
Но вы можете просто использовать cut:
Поскольку никто, кажется, не помещает результаты в массив, как вы просили, я предлагаю следующее:
declare -a array=($(awk -F: '!/^sshd|^postgres/' /etc/passwd)) echo $ root echo $ daemon
Вы можете попробовать что-то вроде:
declare -a array i=0 cut -d: -f1 /etc/passwd|egrep -v "^(sshd|postgres)$"|while read; do array[$i]="$REPLY" i=$((i + 1)) done echo "$"
declare -a array i=0 while read; do array[$i]="$REPLY" i=$((i + 1)) done "
declare -a array i=0 while read; do array[$i]="$REPLY" i=$((i + 1)) done < <(cut -d: -f1 /etc/passwd|egrep -v '^(sshd|postgres)$') echo "$"
В противном случае вы можете использовать awk, а не cut и egrep (оба):
@perreal уже объяснил, что не так с вашим скриптом. Вот что я сделал бы:
cut -d: -f1 /etc/passwd | egrep -v '^(sshd|postgres)$'
cut отпечатки полей ввода. -d: говорит поля разделяются : , -f1 выбирает первое поле.
egrep фильтрует выход cut . -v говорит “распечатать все, что не соответствует”, а регулярное выражение соответствует точно двум именам пользователей. Таким образом, он все равно будет печатать sshd2 или postgresadmin .
declare -a array=($(cut -d: -f1 /etc/passwd | egrep -v '^(sshd|postgres)$'))
(примечание: синтаксис BASH, другие оболочки немного отличаются).
С небольшим количеством awk вы можете достичь своей цели с помощью
i=0 awk -F: '< print $1 >' /etc/passwd | egrep -v '^(sshd|postgres)$' |while read; do array[i]=$REPLY i=$((i + 1)) done #output 5th item in array echo $ #output array length echo $
как перенаправить вывод системного вызова CAT в переменную и проанализировать переменные данные
может быть, я делаю неправильный путь (поэтому я задаю вопрос) в приведенном выше скрипте. Согласно моей логике сначала перенаправьте /etc/passwd на любую переменную с помощью ( cat "/etc/passwd" > OUTPUT не знаю это правильно или неправильно Также в качестве альтернативы пробовали read -ra ADDR
root super admin guest albert ritesh112
Ответы (6)
Не сохраняйте вывод в переменной / массиве (в некоторых случаях вы можете получить всевозможные проблемы с буферизацией - хотя и не с / etc / passwd, и в этом просто нет необходимости), просто сделайте что-нибудь вроде анализа строки за строкой или используйте такой инструмент, как awk или cut как предлагается перреаль e.g.
#!/bin/bash while read -r line; do echo "$" done < /etc/passwd
$ удалит самый длинный суффикс, совпадающий с :* , то есть все, что находится после первого : включительно. Чтобы получить массив, вы можете просто изменить его на (также обратите внимание, что нельзя включать postgres и sshd в массив. Есть несколько способов сделать это, но здесь должно быть достаточно)
#!/bin/bash while read -r line; do [[ "$" != postgres && "$" != sshd ]] && arr+=("$") done < /etc/passwd for i in "$"; do echo -e "$i" done
Или сделайте что-то вроде подстановки команд (но опять же, в большинстве случаев это не лучшая практика)
хорошо, это правда, но он анализирует usrname только для отображения, но то, что мне нужно позже, мне интересно использовать массив списка имен пользователей. - person Jayesh Bhoi; 03.02.2014
ох . отлично, но, пожалуйста, исключите sshd и postgres имя пользователя из списка массивов, чтобы моя работа была выполнена. - person Jayesh Bhoi; 03.02.2014
Не создает переменную, а просто копирует /etc/passwd в файл с именем OUTPUT . Чтобы получить содержимое переменной, вы можете попробовать OUTPUT=$(cat /etc/passwd) . Но вы можете просто использовать вырезать:
declare -a array i=0 cut -d: -f1 /etc/passwd|egrep -v "^(sshd|postgres)$"|while read; do array[$i]="$REPLY" i=$((i + 1)) done echo "$"
declare -a array i=0 while read; do array[$i]="$REPLY" i=$((i + 1)) done "
declare -a array i=0 while read; do array[$i]="$REPLY" i=$((i + 1)) done < <(cut -d: -f1 /etc/passwd|egrep -v '^(sshd|postgres)$') echo "$"
Поскольку кажется, что никто другой не помещает результаты в массив, как вы просили, я предлагаю следующее:
declare -a array=($(awk -F: '!/^sshd|^postgres/' /etc/passwd)) echo $ root echo $ daemon
i=0 awk -F: '< print $1 >' /etc/passwd | egrep -v '^(sshd|postgres)$' |while read; do array[i]=$REPLY i=$((i + 1)) done #output 5th item in array echo $ #output array length echo $
спасибо за помощь . он также отображает sshd и postgres , которые не требуются, а также как хранить список пользователей в массиве - person Jayesh Bhoi; 03.02.2014
Никогда не используйте for i in $(cmd) . Вы можете увидеть этот ответ для получения более подробной информации: stackoverflow.com/questions/19606864/ffmpeg-in-a-bash-pipe/ И в этом случае достаточно использовать cut вместо awk (нет необходимости использовать танк, чтобы убить муху). - person Idriss Neumann; 03.02.2014
cut -d: -f1 /etc/passwd | egrep -v '^(sshd|postgres)$'
Объяснение: cut печатает поля ввода. -d: говорит, что поля разделены : , -f1 выбирает первое поле. egrep дополнительно фильтрует вывод cut . -v говорит «печатать все, что не соответствует», а регулярное выражение соответствует ровно двум именам пользователей. Так что он все равно будет печатать sshd2 или postgresadmin . Чтобы поместить все в массив:
declare -a array=($(cut -d: -f1 /etc/passwd | egrep -v '^(sshd|postgres)$'))
How to assign the cat output of a bash script to a variable in another script
I have a bash script that produces a cat output when it takes an argument. I also have another bash script that executes the first bash script with an an argument that I want to produce cat outputs with. How do I store those cat outputs produced by the first bash script in variables?
2 Answers 2
would store the output of the cat in variable var .
would store the output of myscript in the same variable.
quick tip for bash newbies like me, the spacing & non spacing are all important, follow exact pattern! for example var = $( cat foo.txt ) will not work
@Dalker is there a limit how big the foo.txt can be? I have over 10 mb of data. Would cat store the whole thing? I want to know if there's a limit also for future reference.
@myhouse According to this answer there is no limit due to bash itself, but the limit is rather the memory allocated on the underlying environment, which may of course vary.
Use the double quotes. Try this
It's almost never a bad idea to put things (especially things that begin with $ ) into double quotes, and it doesn't hurt here. However, in the case of assignment to a variable, it doesn't actually help.
You must log in to answer this question.
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.14.43533
Linux is a registered trademark of Linus Torvalds. UNIX is a registered trademark of The Open Group.
This site is not affiliated with Linus Torvalds or The Open Group in any way.
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.