вопрос по Shell

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

вопрос по Shell

Непрочитанное сообщение Fastman » 2007-04-19 10:00:00

я так понимаю, чтобы работать с преобразованием строк удобно юзать awk, читаю сейчас доки, но может кто быстрее подскажет такую вещь:

В скрипт запихивается параметр типа :

Код: Выделить всё

mnt/dir1/dir2/S30265.txt
нужно получить из нее :

Код: Выделить всё

1) /dir1/dir2/S30265.txt

Код: Выделить всё

2) S30265.txt
как это сделать ?
Главное в жизни здоровье и любовь, остальное я все куплю.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Непрочитанное сообщение schizoid » 2007-04-19 10:11:25

на скорую руку, не АВКом:

Код: Выделить всё

# a=mnt/dir1/dir2/S30265.txt; echo ${a:3}
/dir1/dir2/S30265.txt
# a=mnt/dir1/dir2/S30265.txt; echo ${a:14}
S30265.txt
ядерный взрыв...смертельно красиво...жаль, что не вечно...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-19 10:18:02

2) S30265.txt

Код: Выделить всё

# echo "mnt/dir1/dir2/qwerty.txt" | cut -d/ -f4
qwerty.txt
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-19 10:22:36

schizoid писал(а):на скорую руку, не АВКом:

Код: Выделить всё

# a=mnt/dir1/dir2/S30265.txt; echo ${a:3}
/dir1/dir2/S30265.txt
# a=mnt/dir1/dir2/S30265.txt; echo ${a:14}
S30265.txt
Это понятно :) Но дело в том что первая директория может быть и не 3 символа, а во втором случае может быть не 2 поддиректории а 6 например :)
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-19 10:26:51

dikens3 писал(а):2) S30265.txt

Код: Выделить всё

# echo "mnt/dir1/dir2/qwerty.txt" | cut -d/ -f4
qwerty.txt
Аналогично, количество поддиректория я могу и не знать :(
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-19 10:28:59

Код: Выделить всё

# echo "mnt/dir1/dir2/qwerty.txt" | awk -F/ '{print $2,$3,$4}' | sed s/" "/"\/"/g
dir1/dir2/qwerty.txt

Код: Выделить всё

# echo "mnt/dir1/dir2/qwerty.txt" | awk -F/ -v OFS="/" '{print $2,$3,$4}'
dir1/dir2/qwerty.txt
Тогда показывай все данные(разные т.е.)

Код: Выделить всё

Количество полей разделённых /
# echo "mnt/dir1/dir2/qwerty.txt" | awk -F/ '{print NF}'
4
Последний раз редактировалось dikens3 2007-04-19 10:33:12, всего редактировалось 1 раз.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Непрочитанное сообщение schizoid » 2007-04-19 10:32:55

т.е. нуно выдать
1. все без первой дирректории
2. только имя файла
так?
или и это не полное условие?
ядерный взрыв...смертельно красиво...жаль, что не вечно...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-19 10:34:41

Только имя файла:

Код: Выделить всё

# echo "mnt/dir1/dir2/qwerty.txt" | awk -F/ '{print $(NF)}'
qwerty.txt
Без первой директории / вначале нужен будет?
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-19 10:45:56

schizoid писал(а):т.е. нуно выдать
1. все без первой дирректории
2. только имя файла
так?
или и это не полное условие?
Да именно так.
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-19 10:47:43

dikens3 писал(а):Только имя файла:

Код: Выделить всё

# echo "mnt/dir1/dir2/qwerty.txt" | awk -F/ '{print $(NF)}'
qwerty.txt
Без первой директории / вначале нужен будет?
Спасибо за вариант. Сейчас буду пробовать.

Да должно получиться : /dir1/dir2/dirN/file.nnn
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-19 10:59:58

Код: Выделить всё

#!/bin/sh

test1="mnt/dir1/dir2/qwerty.txt"
test2="mnt/dir1/dir2/dir3/dir4/qwerty.txt"
test3="mnt/dir1/dir2/dir3/dir4/dir5/dir6/qwerty.txt"

echo
echo "test1:"
mysed=$(echo "$test1" | awk -F/ '{print $1}')
echo "$test1" | sed s/"$mysed"/""/g

echo
echo "test2:"
mysed=$(echo "$test2" | awk -F/ '{print $1}')
echo "$test2" | sed s/"$mysed"/""/g

echo
echo "test3:"
mysed=$(echo "$test3" | awk -F/ '{print $1}')
echo "$test3" | sed s/"$mysed"/""/g

Код: Выделить всё

# ./test.sh

test1:
/dir1/dir2/qwerty.txt

test2:
/dir1/dir2/dir3/dir4/qwerty.txt

test3:
/dir1/dir2/dir3/dir4/dir5/dir6/qwerty.txt
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-19 11:00:40

Опишу задачу, чтоб было понятно.

Есть самописанный TCP сервер, который получает данные от Win32 клиента.
Данные - 3 параметра.

1) Путь к файлу
2) Путь к выходному файлу
3) Параметр для внутреннего условия (тут он не важен)

по smbfs подмонтированны папки расшаренные на других Win32 серваках,
допустим:

/mnt/SOURCE
/mnt/DESTINATION

В них могут быть и подпапки которые создаст сам клиент, то есть:

/mnt/SOURCE/DIR1/DIR2/DIRN

Какие подпапки будут сформированы и сколько - заранее я не знаю, я просто получу
путь полный к файлу, те:

/mnt/SOURCE.dir1/dir2/qwerty.txt

и путь куда потом после моих манипуляций нужно будет его положить

/mnt/DESTINATION/DIR1/DIRN/qwerty.txt

Вся фишка в том что должен быть вариант работы по ftp, корневой папкой в таком случае по условию должна быть папка /mnt , поэтом для каких либо действий, нужно убрать первую директорию, и выковырять из строчки полного пути имя файла.

Может сумбурно, но так нужно сделать....
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-19 11:06:25

Если первая всегда одинаковая, тогда ещё проще:

Код: Выделить всё

echo "$test1" | sed s/"/mnt"/""/g
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-19 11:06:33

dikens3 писал(а):

Код: Выделить всё

#!/bin/sh

test1="mnt/dir1/dir2/qwerty.txt"
test2="mnt/dir1/dir2/dir3/dir4/qwerty.txt"
test3="mnt/dir1/dir2/dir3/dir4/dir5/dir6/qwerty.txt"

echo
echo "test1:"
mysed=$(echo "$test1" | awk -F/ '{print $1}')
echo "$test1" | sed s/"$mysed"/""/g

echo
echo "test2:"
mysed=$(echo "$test2" | awk -F/ '{print $1}')
echo "$test2" | sed s/"$mysed"/""/g

echo
echo "test3:"
mysed=$(echo "$test3" | awk -F/ '{print $1}')
echo "$test3" | sed s/"$mysed"/""/g

Код: Выделить всё

# ./test.sh

test1:
/dir1/dir2/qwerty.txt

test2:
/dir1/dir2/dir3/dir4/qwerty.txt

test3:
/dir1/dir2/dir3/dir4/dir5/dir6/qwerty.txt
То что надо :)
Осталось только имя файла выковырять :)
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-04-19 11:09:17

Несовсем то, что надо. если будет путь /mnt/dir1/dir2/mnt/qwerty.txt то пипец. :-)

P.S. Дальше сам думай. Нет желания за тебя скрипты писать.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-19 11:26:09

dikens3 писал(а):Несовсем то, что надо. если будет путь /mnt/dir1/dir2/mnt/qwerty.txt то пипец. :-)

P.S. Дальше сам думай. Нет желания за тебя скрипты писать.
Оч помог. Человеческое спасибо :)
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Непрочитанное сообщение schizoid » 2007-04-21 20:20:44

решил не множиь темы.
вопрос тоже по шел
как правильно описать конструкцию вида:

если [ что-то = этому И это = вот_этому]
то ....

вопрос. как правильно описать это И ?
ядерный взрыв...смертельно красиво...жаль, что не вечно...

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Непрочитанное сообщение Fastman » 2007-04-22 0:05:31

! (not) Логическое "НЕ"

-o (or) Логическое "ИЛИ"

-a (and) Логическое "И"
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Непрочитанное сообщение abanamat » 2007-04-22 3:07:58

можно я со своим мерзким башом влезу в разбор диров :))

Код: Выделить всё

#!/usr/local/bin/bash

if [ -z "$*" ]; then echo "ERROR: give me the way!"; exit 1; fi; srcway="$*"

bydir=( `echo ${srcway// /#} | tr '/' ' '` )
nm_bydir="${#bydir[*]}"; let "nm_bydir -= 1"; let "way_end = ${nm_bydir} - 1"

function print_way {
for (( i=1; i <= ${way_end}; i++ )); do echo -n ${bydir[i]}/; done
}

root_path=`echo /${bydir[0]} | sed 's/#/\\\ /g'`
other_way=`print_way | sed 's/#/\\\ /g'`
file_name=`echo ${bydir[nm_bydir]} | sed 's/#/\\\ /g'`

cat << EOF
${root_path}
${other_way}
${file_name}
EOF
столько много понаписано заради пробелов идрить их растудыть. Разные ситуации бывают..

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Непрочитанное сообщение abanamat » 2007-04-22 12:19:26

schizoid писал(а):решил не множиь темы.
вопрос тоже по шел
как правильно описать конструкцию вида:

если [ что-то = этому И это = вот_этому]
то ....

вопрос. как правильно описать это И ?

Код: Выделить всё

if [ ! -z "$1" ]; then
    if [ ! -z "$2" ]; then
        echo "lol"
    fi
fi

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Непрочитанное сообщение schizoid » 2007-04-22 22:05:29

! (not) Логическое "НЕ"

-o (or) Логическое "ИЛИ"

-a (and) Логическое "И"
на баше не проходит такая конструкция :(
if [ ! -z "$1" ]; then
if [ ! -z "$2" ]; then
echo "lol"
fi
fi
про это уже думал, но просто проверяется 4-ре параметра, и в теле скрипта... такое нагромождение не хотелось липить...
но если вариантов нету, придется :(
ядерный взрыв...смертельно красиво...жаль, что не вечно...

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Непрочитанное сообщение abanamat » 2007-04-22 22:16:51

#!/usr/local/bin/bash

[ ! -z "$*" ] || exit 1; nmbr="$*"

if ( [ ${nmbr} -ne 1 ] && [ ${nmbr} -ne 2 ] && [ ${nmbr} -ne 3 ] && [ ${nmbr} -ne 5 ] ); then
echo ${nmbr}; else echo "figu!"; fi
exit 0

:)

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Непрочитанное сообщение schizoid » 2007-04-23 15:27:41

снкс за идею!
сделал вот в таком виде:

Код: Выделить всё

#!/bin/sh
a=123
b=456
c=789
if ( [ -n "$a" ] && [ -n "$b" ] && [ -n "$c" ] && [ -n "$d" ] );
  then  echo good!
  else  echo "bad :("
fi
ядерный взрыв...смертельно красиво...жаль, что не вечно...