Para obtener el K
de LposK.dat
, si esa cadena está en $name
, podemos hacer
k=${name%.dat} # remove ".dat" suffix
k=${k##*pos} # remove everything up to end of (the last) "pos"
Esto funcionaría incluso si $name
fuera un nombre de ruta comosome/path/LposK.dat
(e incluso si some/path
contuviera la cadena pos
), lo cual es útil cuando lo conectamos más adelante en find
.
Para mover un archivo:
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest" # only move if mkdir did not fail
Confind
:
find. -type f -name '*pos*.dat' -exec sh -c '
for name do
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest"
done' sh {} +
Esto le daría al script interno sh -c
una serie de nombres de ruta como argumentos, y el script iteraría sobre estos, moviendo cada uno al subdirectorio correcto de $HOME/destination
.
Relacionado:
Si sus archivos están en un solo subdirectorio (el directorio actual ), entonces puede hacerlo aún más fácilmente sinfind
:
for name in./*pos*.dat; do
[ ! -f "$name" ] && continue # skip non-regular files
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest"
done
Вы можете использовать символы ()
в качестве разделителей полей вместо пробелов:
arp -a | awk -F'[()]' '{print $2}' | head -1
с помощьюcut
:
arp -a | awk '{print $2}' | head -1 | cut -d "(" -f 2 | cut -d ")" -f 1
Обновление ответа, как предложено в комментарии:
cut
объяснение:
-d
-действует как разделитель и разбивает строку при первом появлении(
-f
-выбирает указанное поле. Здесь выбирается вторая часть, которая будетx.x.x.x)
Мы передаем этот вывод в качестве входных данных для следующего cut
, используя|
cut -d ")" -f 1
-Это снова разделяет ввод на )
, и мы выбираем первую часть, то есть только IP-адрес.
tr
хорош в таких вещах, как удаление ненужных символов:
$ tr -d '()' <<< '(192.168.1.1)'
192.168.1.1
В общем, так и должно быть:
arp -a | awk '{print $2}' | head -1 | tr -d '()'