Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Файл с пробелом в имени в качестве параметра

Добрый день,
имею файл с именем следующего формата "2015-01-30 name1@10.0.0.81 - name2@10.0.0.81.html" - это лог сервера ejabberd с установленным модулем mod_log_chat.

Хочу парсить этот лог. Парсер уже написал, все работает, как надо, осталась проблема - передать этот файл в качестве параметра моему парсеру

В теле парсера первая строка выглядит так:
Код Bash
1
lastWord=`cat $1 | grep messagetext
То есть первый параметр скрипта я подсовываю команде cat.
Проблема в том, что в имени файла есть пробелы и получается
первый параметр: 2015-01-30
второй параметр: name1@10.0.0.81
третий параметр: -
четвертый: name2@10.0.0.81.html

Я пробовал экранировать пробелы в названии файла, пробовал брать его в апострофы и в ковычки, но ОС всеравно воспринимает это, как несколько параметров.

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

Есть идеи, как можно это обойти?
Ответ:
Код Bash
1
cat "$1"
в скрипте, а при запуске скрипта
Код Bash
1
script '2015-01-30 name1@10.0.0.81 - name2@10.0.0.81.html'
Вопрос: Подскажите, как правильно сделать (bash, echo, pipes)

Приветствую!

Я не очень опытный пользователь Linux, поэтому сорри за возможно ламерский вопрос.
У меня задача: в CentOS7 строкой в файле bash (или в командной строке) сделать следующее: в определенный файл (допустим /tmp/my.txt) записать некую константную строку (допустим, "My PC hostname is"), затем добавить пробел и в той же строке вывести текущее имя хоста, получаемое выполнением команды hostname.

Что то типа такого (но так не работает - выводит только строку с именем хоста, без предшествующей константной части, это я привел для иллюстрации того, как я пытаюсь сделать):

 echo $'My PC hostname is ' | hostname >> /tmp/my.txt 


P.S. подсветки кода sh/bash на форуме, как я понял, нет, так что извините за некорретную подсветку

Спасибо.
Ответ:
Los Pejos
Приветствую!

Я не очень опытный пользователь Linux, поэтому сорри за возможно ламерский вопрос.
У меня задача: в CentOS7 строкой в файле bash (или в командной строке) сделать следующее: в определенный файл (допустим /tmp/my.txt) записать некую константную строку (допустим, "My PC hostname is"), затем добавить пробел и в той же строке вывести текущее имя хоста, получаемое выполнением команды hostname.

Что то типа такого (но так не работает - выводит только строку с именем хоста, без предшествующей константной части, это я привел для иллюстрации того, как я пытаюсь сделать):

 echo $'My PC hostname is ' | hostname >> /tmp/my.txt 


P.S. подсветки кода sh/bash на форуме, как я понял, нет, так что извините за некорретную подсветку

Спасибо.

Вы не поняли, что значит | (пайп). погуглите на тему.
Вопрос: Выбрать из файла только одну запись

Доброго времени суток.
Есть скрипт который проводит определенные операции с бд написанный в bash.
Имеется файл alias.conf в котором прописана бд следующим образом: db=/home/admin/base/db.fdb. Но может быть еще несколько строк (баз).
Как прописать в скрипте что бы он использовал файл alias.conf но брал одну конкретную базу? (допустим ту что в премере)
Ответ: 1. Небезопасно называть файл созвучно с именами программ, функций и т.д. (есть такая программа alias)
2. Если другие переменные|команды в alias.conf не повредят в скрипте то его можно прочитать целиком командой source alias.conf и использовать в виде переменной $eldata
3. Обработать только соответствующую строку с помощью export, eval, ...
Код Bash
1
eval $(grep -m1 '^eldata=' alias.conf)
4. Cчитать только путь в соответствующую переменную
Код Bash
1
eldata=$(sed -n 's/^eldata=//p' alias.conf)
Вопрос: bin/bash: error на centos

parallel -j0 ping -nc 3 ::: foss.org.my gnu.org freenetproject.org

parallel: Warning: YOU ARE USING --tollef. IF THINGS ARE ACTING WEIRD USE --gnu.
parallel: Warning: --tollef is obsolete and will be retired 20140222.
parallel: Warning: See: http://lists.gnu.org/archive/html/parallel/2013-02/msg00018.html
/bin/bash: -c: option requires an argument
/bin/bash: 3: command not found
/bin/bash: foss.org.my: command not found
/bin/bash: :::: command not found
/bin/bash: gnu.org: command not found
/bin/bash: freenetproject.org: command not found
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination


на ubuntu тотже самый код работает впринципе неплохо.
parallel установлен через yum.
систему обновил yum update
Ответ: а что у вас в файлах /etc/parallel/config, ~/.parallel/config и переменной окружения $PARALLEL ?
Вопрос: Помогите с bash новичку

Новичок в bash'е

есть папка OPTION_FL
-- подпапки
--- BATO
--- MCRY
--- XCBO

В каждой подпапке много zip архивов.

Как пробежаться по каждой подпапке и по каждому zip архиву внутри подпапки разархировать все zip и сложить в один файл ?
Ответ:
x17.mstu
x17.mstu,

find -type f -iname '*.gz' -execdir bash -c 'mkdir -p photo ; gunzip -d photo {}' \;


Попробовал вот так но папка photo не создается, это папка куда хочу положить все разипаные файлы

а сперва создать папку, а потом уже разархивировать туда?
Вопрос: Bash скрипт для скачивания картинок с веб-сайта

Нашел замечательный скрипт с данного источника -

#!/bin/bash
#Description: Images downloader
#Filename: img_downloader.sh
if [ $# -ne 3 ];
then
echo "Usage: $0 URL -d DIRECTORY"
exit -1
fi
for i in {1..4}
do
case $1 in
-d) shift; directory=$1; shift ;;
*) url=${url:-$1}; shift;;
esac
done
mkdir -p $directory;
baseurl=$(echo $url | egrep -o "https?://[a-z.]+")
curl –s $url | egrep -o "<img src=[^>]*>" | sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list
sed -i "s|^/|$baseurl/|" /tmp/$$.list
cd $directory;
while read filename;
do
curl –s -O "$filename" --silent
done < /tmp/$$.list


Но к сожалению при выполнение команды под root пользователем, выдает Permission Denied. Подскажите в чем может быть проблема.
sh-3.2# ./img_downloader.sh http://www.flickr.com/search/?q=linux -d images
sh: ./img_downloader.sh: Permission denied
sh-3.2# whoami
root
sh-3.2# 
Ответ: брад галимый. я скачивал коллекцию картинок на вноый товар с сайта одной строкой по типу xsel | wget -O - | sed | wget

ну иногда небольшие вариации, например если надо переименовал файл..

xsel -b|wget -i - -O -|sed -rn 's/^.*"(http[^"]+.(gif|jpg|jpeg)).*/\1/p' |sed 's/thumb/full/' | wget -ci -


что-то по типу этого. но там не было двух картинок (нужных мне) указанных в одной строке исходников. (и второй сед явно не обязателен :) )
Вопрос: Client-server на bash

Помогите, пожалуйста. Нужны самые простенькие клиент и сервер на bash, используя nc. Клиент и сервер слушают друг друга и могут отправлять сообщения друг другу

Добавлено через 2 часа 32 минуты
попробовала передать файл пишу в одном терминале cat file1 | nc -l -p 1234 в другом nc 127.0.0.1 1234 > file2 и просто создается пустой файл file2... ничего не происходит( и не могу понять почему(
Ответ: Попробуйте с опцией -i
Ксати опция -q есть не во всех дистрах. Например я не могла запустить одну программу на fedora
а на дебиане работала на ура. Начала разбираться и обнаружила отсутсвие в fedore опции -q
Вопрос: Как в bash проверить значение переменной чтобы совпадало с одним из вариантов?

например:
Bash
1
PARAMETER="true" # может быть enabled, on, yes
а дальше что-то типа:
Bash
1
2
3
4
if [[ echo $PARAMETER | grep -e "true|on|yes" ]]; then
echo "опция включена"
else echo "опция не включена"
fi
Ответ:
Bash
1
2
3
4
sed -i '
    /^VAR1=/s/[^=]*$/"false"/
    /^NAME=/s/[^=]*$/"vasya"/
    ' ~/vars.cfg
Вопрос: Передать файлы через bash

Можно ли передать файлы через телефон на комп с помощью баш? Ситуация следующая. И комп и ноут и телефон подключены к одной сетке. У ноута к примеру ип 192.168.0.15 у компа 192.168.0.1 , у телефона неважно(но он тоже в этой сетке) , так как у меня на нем не полная версия консоли и я просто буду передавать с него на ноут. Так вот вопрос как это осуществить? Я пробовал с телефона по прямому адресуу ноута отправить , но вылезало уведомление - connection refused. Чтобы я смогу с помощью scp например скинуть на ноут файлы, можно ли как - то обойтись без поднятия сервера на ноуте? как можно это осуществить?
Ответ:
Сообщение от Stas Risen
Она тунель открывает на время или что?
Нет.

Сообщение от Stas Risen
И что значат ключи -l и -p?
Ключ -l значит начать "слушать" порт, который указывается после ключа -p. Т.е. программа начинает работать, как небольшой сервер, который ожидает подключения к порту. На другом хосте вы запускаете слиент:
Bash
nc IP_ADDR_PHONE 6666 > file
который подключится к серверу по адресу IP_ADDR_PHONE к порту 6666.
Вопрос: Передача и обработка stdout в bash скрипт

Добрый день! С башем работаю очень мало, пытался найти нормальнй ответ в интернете, но не смог.
Скажите пожалуйста, как можно передать в скрипт вывод переданный из другой команды:
Например у меня вызывается какая то функция и ее вывод я хочу передать в bash скрипт, в который также передаю пару переменных
Код Bash
1
 /usr/bin/konf --socket=/var/run/konfd.socket -- -d | temp.sh "include" "[0-9]{1,3}\.[0-9]{1,3}\."
Как можно работать с этим выводом в скрипте, если я сначала хочу проверить несколько условий в зависимости от переменных, а потом уже только использовать вывод и причем неоднократно
Ответ: Попробуй (если версия bash поддерживает)
Код Bash
1
showPIPE.sh <(ifconfig) "${choice}" "${~LINE}"
Если нет, надо будет сам скрипт showPIPE.sh менять