Страница 1 из 1

вопрос по Shell

Добавлено: 2007-04-19 10:00:00
Fastman
я так понимаю, чтобы работать с преобразованием строк удобно юзать awk, читаю сейчас доки, но может кто быстрее подскажет такую вещь:

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

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

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

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

1) /dir1/dir2/S30265.txt

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

2) S30265.txt
как это сделать ?

Добавлено: 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
Если первая всегда одинаковая, тогда ещё проще:

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

echo "$test1" | sed s/"/mnt"/""/g

Добавлено: 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