Шаблонное чтение (как scanf)

Это просто, вы можете использовать:

 du -b /tmp/* | awk 'BEGIN{i=0} {i=i+$1} END{print i}'

Если вы не используете подстановочный знак, если вы используете имя каталога, такое как /tmp, вам нужно избегать последней записи, потому что вывод du -b /tmpпохож на:

size1 file1
size2 file2
size_total.

Так что теперь вам следует избегать этой последней записи, поэтому используйте:

du -b /tmp | awk 'BEGIN{i=0} {if( $2 != "." ){i=i+$1}} END{print i}'

Однако вы также можете использовать опцию -s, она рассчитает сводку за вас, после чего вам не нужно добавлять значения, просто распечатайте последнее, т.е.:

du -s directory
2
18.06.2019, 11:54
2 ответа

Можно ли использовать регулярные выражения? Мне все равно пришлось раскошелиться на sed, чтобы чисто заменить %...%на (.*), хотя:

$ psource=/backup/monthly.1/where/somehost-someshare
$ tsource=/backup/%PERIOD%/where/%HOST%-%SHARE%
$ # replace labels with '(.*)', need sed to avoid greediness of * in ${../../..}
$ tsource_re=$(sed 's/%[^%]*%/(.*)/g' <<<"${tsource}")
$ # match against tsource to get template names
$ [[ $tsource =~ $tsource_re ]]; tmatch=(${BASH_REMATCH[@]:1})
$ # match against psource to get template values
$ [[ $psource =~ $tsource_re ]]; pmatch=(${BASH_REMATCH[@]:1})
$ for i in ${!tmatch[@]}; do printf "%s:\t%s\n" "${tmatch[$i]}" "${pmatch[$i]}"; done
%PERIOD%:   monthly.1
%HOST%: somehost
%SHARE%:    someshare
2
27.01.2020, 22:02

это должно помочь:

tsource='/backup/%HOST%/%SHARE%/%PERIOD%'
psource='/backup/somehost/someshare/monthly.1'
IFS=$'\n' read -d '' -ra var_names <<< $(grep -Po "(?<=%)[[:upper:]]+(?=%)" <<< "$tsource")
IFS='/' read -ra var_values <<< $(echo ${psource#/*/})
declare -A vars=( ["${var_names[0]}"]="${var_values[0]}" ["${var_names[1]}"]="${var_values[1]}" ["${var_names[2]}"]="${var_values[2]}" )

echo ${vars[HOST]} ${vars[SHARE]} ${vars[PERIOD]}

>somehost someshare monthly.1

1
27.01.2020, 22:02

Теги

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