Вы можете просто проверить количество аргументов и обработать их в обратном порядке, например для простого случая с двумя аргументами, где аргумент первый является необязательным:
usage() {
cat << EOF
Usage: $0 [host] port
EOF
}
[ "$#" -eq 0 ] && { usage; exit 1;}
if [ "$#" -gt 1 ]; then
myhost="$1"
shift
fi
myport="$1"
Однако вы также упоминаете идею трех аргументов. На самом деле нетривиально иметь три необязательных аргумента, определяемых позицией - что, если вы хотите указать первый и третий, но не второй? Такие сценарии практически невозможно обработать с помощью одних только позиционных параметров, но они очень просты при правильном использовании getopts
.
usage() {
cat << EOF
usage: $0 [OPTIONS]
-p port number (required)
-h hostname (optional)
EOF
}
while getopts :p:h: opt; do
case "$opt" in
p)
myport="$OPTARG"
;;
h)
myhost="$OPTARG"
;;
:)
printf %s\\n "Argument required for option -$OPTARG" >&2
usage >&2
exit 1
;;
\?)
printf %s\\n "Unknown option -$OPTARG" >&2
usage >&2
exit 1
;;
esac
done
shift "$((OPTIND-1))"
if [ -z "$myport" ]; then
printf %s\\n "You must supply a port" >&2
usage >&2
exit 1
fi
Вы можете сделать это, просто используя awk
функции обработки строк
awk -F'/[/]?' '$NF ~ /^(master1|master3).*/{ n=split($2,arr,":"); print arr[1] }'
с помощью grep:
grep 'master[1,3]' | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}"
Выполнено с помощью команды sed, все работает нормально
команда
sed -e "s/.*\:\///g" -e "s/:.*//g" -e "s/\///g" filename
выход
192.23.39.2
192.23.39.2
Сделано также с помощью Python
import re
p=re.compile(r'[0-9]*\.[0-9]*\.[0-9]*')
k=open('filename','r')
for i in k:
h=re.search(p,i)
print h.group()
выход
192.23.39
192.23.39