Использованиеjq
:
jq -r '.[]' file
Использованиеegrep
:
egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' file
или
egrep -o '([0-9]+\.){3}[0-9]+' file
Использованиеgrep
:
grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' file
Используйте только один -exec
вместе с sh -c
:
find. -exec sh -c '
NOW=$(date +%s);
echo "$NOW $1 First Output";
sleep 3;
echo "$NOW $1 Second Output";
' find-sh {} \;
В качестве альтернативы, если вы по какой-либо причине хотите придерживаться цепочек -exec
s, вы можете использовать временный файл, но тогда вам нужно sh -c
всякий раз, когда вы читаете этот временный файл:
find. \
-exec sh -c 'date +%s > /tmp/now' \; \
-exec sh -c 'echo "$(cat /tmp/now) $1 First Output"' find-sh {} \; \
-exec sleep 3 \; \
-exec sh -c 'echo "$(cat /tmp/now) $1 Second Output"' find-sh {} \;
Следующий -exec
не будет работать, потому что оболочка будет оценивать часть $(..)
перед запуском find
:
-exec echo "$(cat /tmp/now) {} First Output" \;
ПС:
Вы можете спросить, откуда это find-sh
из -exec sh -c '...' find-sh {}
. Вот ответ .
Установить NOW
для каждого файла заново, т.е. внутри петли for
:
find. -exec sh -c '
for f do
NOW=$(date +%s)
echo "$NOW $f First Output"
sleep 3
echo "$NOW $f Second Output"
done
' find-sh {} +
Мне не совсем понятно, что вы хотите сделать, но если вам нужно значение $NOW
, которое обновляется до текущего времени эпохи в момент обработки каждого файла, вы можете использовать zsh
и его $EPOCHSECONDS
переменная (или $EPOCHREALTIME
, если вам нужны также наносекунды )в модуле zsh/datetime
(или ${(%):-%D{%s}}
без zsh/datetime
, хотя это менее разборчиво):
find. -exec zsh -c '
zmodload zsh/datetime
typeset -F SECONDS # make it float
for file do
start_time=$EPOCHSECONDS SECONDS=0
print -r $start_time processing $file
processing $file
end_time=$EPOCHSECONDS duration=$SECONDS
print start=$start_time end=$end_time duration=$SECONDS
done' zsh {} +
Или поскольку zsh
может выполнять работу find
с его рекурсивными глобусами:
#! /bin/zsh -
zmodload zsh/datetime
typeset -F SECONDS # make it float.
for file (./**/*(ND)) {
start_time=$EPOCHSECONDS SECONDS=0
print -r $start_time processing $file
processing $file
end_time=$EPOCHSECONDS duration=$SECONDS
print start=$start_time end=$end_time duration=$SECONDS
}
В оболочке bash
вы можете получить эквивалент start_time=$EPOCHSECONDS
с помощью printf -v start_time '%(%s)T'
.