Страница 1 из 1
вопрос по Shell
Добавлено: 2007-04-19 10:00:00
Fastman
я так понимаю, чтобы работать с преобразованием строк удобно юзать awk, читаю сейчас доки, но может кто быстрее подскажет такую вещь:
В скрипт запихивается параметр типа :
нужно получить из нее :
как это сделать ?
Добавлено: 2007-04-19 10:11:25
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
Добавлено: 2007-04-19 10:18:02
dikens3
2) S30265.txt
Код: Выделить всё
# echo "mnt/dir1/dir2/qwerty.txt" | cut -d/ -f4
qwerty.txt
Добавлено: 2007-04-19 10:22:36
Fastman
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 например

Добавлено: 2007-04-19 10:26:51
Fastman
dikens3 писал(а):2) S30265.txt
Код: Выделить всё
# echo "mnt/dir1/dir2/qwerty.txt" | cut -d/ -f4
qwerty.txt
Аналогично, количество поддиректория я могу и не знать

Добавлено: 2007-04-19 10:28:59
dikens3
Код: Выделить всё
# 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
Добавлено: 2007-04-19 10:32:55
schizoid
т.е. нуно выдать
1. все без первой дирректории
2. только имя файла
так?
или и это не полное условие?
Добавлено: 2007-04-19 10:34:41
dikens3
Только имя файла:
Код: Выделить всё
# echo "mnt/dir1/dir2/qwerty.txt" | awk -F/ '{print $(NF)}'
qwerty.txt
Без первой директории / вначале нужен будет?
Добавлено: 2007-04-19 10:45:56
Fastman
schizoid писал(а):т.е. нуно выдать
1. все без первой дирректории
2. только имя файла
так?
или и это не полное условие?
Да именно так.
Добавлено: 2007-04-19 10:47:43
Fastman
dikens3 писал(а):Только имя файла:
Код: Выделить всё
# echo "mnt/dir1/dir2/qwerty.txt" | awk -F/ '{print $(NF)}'
qwerty.txt
Без первой директории / вначале нужен будет?
Спасибо за вариант. Сейчас буду пробовать.
Да должно получиться : /dir1/dir2/dirN/file.nnn
Добавлено: 2007-04-19 10:59:58
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
Добавлено: 2007-04-19 11:00:40
Fastman
Опишу задачу, чтоб было понятно.
Есть самописанный 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 , поэтом для каких либо действий, нужно убрать первую директорию, и выковырять из строчки полного пути имя файла.
Может сумбурно, но так нужно сделать....
Добавлено: 2007-04-19 11:06:25
dikens3
Если первая всегда одинаковая, тогда ещё проще:
Добавлено: 2007-04-19 11:06:33
Fastman
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
То что надо

Осталось только имя файла выковырять

Добавлено: 2007-04-19 11:09:17
dikens3
Несовсем то, что надо. если будет путь /mnt/dir1/dir2/mnt/qwerty.txt то пипец. :-)
P.S. Дальше сам думай. Нет желания за тебя скрипты писать.
Добавлено: 2007-04-19 11:26:09
Fastman
dikens3 писал(а):Несовсем то, что надо. если будет путь /mnt/dir1/dir2/mnt/qwerty.txt то пипец. :-)
P.S. Дальше сам думай. Нет желания за тебя скрипты писать.
Оч помог. Человеческое спасибо

Добавлено: 2007-04-21 20:20:44
schizoid
решил не множиь темы.
вопрос тоже по шел
как правильно описать конструкцию вида:
если [ что-то = этому И это = вот_этому]
то ....
вопрос. как правильно описать это И ?
Добавлено: 2007-04-22 0:05:31
Fastman
! (not) Логическое "НЕ"
-o (or) Логическое "ИЛИ"
-a (and) Логическое "И"
Добавлено: 2007-04-22 3:07:58
abanamat
можно я со своим мерзким башом влезу в разбор диров

)
Код: Выделить всё
#!/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
столько много понаписано заради пробелов идрить их растудыть. Разные ситуации бывают..
Добавлено: 2007-04-22 12:19:26
abanamat
schizoid писал(а):решил не множиь темы.
вопрос тоже по шел
как правильно описать конструкцию вида:
если [ что-то = этому И это = вот_этому]
то ....
вопрос. как правильно описать это И ?
Код: Выделить всё
if [ ! -z "$1" ]; then
if [ ! -z "$2" ]; then
echo "lol"
fi
fi
Добавлено: 2007-04-22 22:05:29
schizoid
! (not) Логическое "НЕ"
-o (or) Логическое "ИЛИ"
-a (and) Логическое "И"
на баше не проходит такая конструкция
if [ ! -z "$1" ]; then
if [ ! -z "$2" ]; then
echo "lol"
fi
fi
про это уже думал, но просто проверяется 4-ре параметра, и в теле скрипта... такое нагромождение не хотелось липить...
но если вариантов нету, придется

Добавлено: 2007-04-22 22:16:51
abanamat
#!/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

Добавлено: 2007-04-23 15:27:41
schizoid
снкс за идею!
сделал вот в таком виде:
Код: Выделить всё
#!/bin/sh
a=123
b=456
c=789
if ( [ -n "$a" ] && [ -n "$b" ] && [ -n "$c" ] && [ -n "$d" ] );
then echo good!
else echo "bad :("
fi