Разобрать команду arp -a только для ip

Para obtener el Kde 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 $namefuera un nombre de ruta comosome/path/LposK.dat(e incluso si some/pathcontuviera 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 -cuna 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

1
22.07.2019, 18:44
3 ответа

Вы можете использовать символы ()в качестве разделителей полей вместо пробелов:

arp -a | awk -F'[()]' '{print $2}' | head -1
1
27.01.2020, 23:30

с помощью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-адрес.

1
27.01.2020, 23:30

trхорош в таких вещах, как удаление ненужных символов:

$ tr -d '()' <<< '(192.168.1.1)'
192.168.1.1

В общем, так и должно быть:

arp -a | awk '{print $2}' | head -1 | tr -d '()'
0
27.01.2020, 23:30

Теги

Похожие вопросы