Вероятно, самым простым способом будет простой grep:
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" /path/to/sourcefile > output.txt
Это позволит извлечь все IP-адреса из исходного файла и записать их в файл output.txt, разделив их новой строкой.
Использование только встроенных функций bash
strip_slashes(){
declare -n stripped=$1
local -i i
stripped=$3
for((i=0;i<$2;i++)) ; do
stripped=${stripped#*/}
done
stripped="/$stripped"
}
Это вызывается как
strip_slashes X 3 "/home/user/test/folder"
echo $X
Первый параметр — это имя переменной для хранения результата, затем количество удаляемых косых черт и значение, из которого их следует удалить.
Передача имени переменной для хранения результата означает, что вам не нужно жестко кодировать имя (, например. REPLY используется по умолчанию для выбора и чтения )и не нуждается в подоболочке. Послеdeclare -n
stripped
следует псевдоним именованной переменной.
sed решения. Использование gnu sed
echo /home/user/test/folder | sed -E 's:(/[^/]*){2}::'
более портативный
echo /home/user/test/folder | sed 's:/[^/]*/[^/]*::'
Если предположить, что /home/user/test/folder
является содержимым некоторой переменной dirpath
, и что домашний каталог текущего пользователя, заданный $HOME
, равен /home/user
, тогда следующий код напечатает Path under $HOME directory is "/test/folder"
.
dirpath=/home/user/test/folder
printf 'Path under $HOME directory is "%s"\n' "${dirpath#$HOME}"
Это достигается путем удаления строки префикса $HOME
из $dirpath
с помощью стандартного расширения параметра.
Это может быть обобщено на другие пути, отличные от описанных в$HOME
:
dirpath=/0/1/2/somewhere/output/test/folder
topdir=${dirpath%/*/*}
printf 'The path under "%s" is "%s"\n' "$topdir" "${dirpath#$topdir}"
Это напечатает The path under "/0/1/2/somewhere/output" is "/test/folder"
.
Значение для topdir
задается путем удаления всего, что соответствует /*/*
, с конца $dirpath
с использованием стандартной подстановки параметров. Образец /*/*
должен точно соответствовать тому, что мы позже хотим найти в конце $dirpath
, в данном случае двум последним компонентам пути $dirpath
.
После нахождения $topdir
мы просто повторяем упражнения, как мы это делали, когда самым верхним -каталогом был $HOME
.
Поскольку вы знаете разделитель, нет ничего плохого в том, чтобы добавить его снова.
path="/$(echo "/home/user/test/folder" | cut -d'/' -f4-)"
echo "$path"