Регулярное выражение сценария Bash для размера файла
Я пытаюсь извлечь размер (в КБ) из файла. Попытка сделать это следующим образом:
textA=$(du a)
sizeA=$(expr match "$textA" '\(^[^\s]*\)')
textB=$(du b)
sizeB=$(expr match "$textB" '\(^[^\s]*\)')
echo $textA
echo $sizeA
echo $textB
echo $sizeB
[[ $sizeA == $sizeB ]] && echo "eq"
Но это просто печатает в консоль textA и textB. Оба похожи на:
30745 a
Может кто-нибудь объяснить, почему не соответствует регулярное выражение? Я пытался проверить регулярное выражение против текста на многих сайтах, просто чтобы убедиться, и он, кажется, захватывает правильный текст.
Я также попытался изменить его на:
'^\([^\s]*\)'
Но так он захватит весь текст. Какие-нибудь мысли?
4 ответа
Мой expr match
не понимает \s
или другие расширенные регулярные выражения. Пытаться '\([0-9]*\)'
вместо.
Но, как уже упоминалось, использование regexp для получения "первого слова" немного излишне. Я бы использовал du s | { read a b; echo $a; }
, но вы также можете использовать awk
версия или решения, использующие cut
,
Не прямой ответ, но я бы сделал это так:
sizeA=$(du a | awk '{print $1}')
Не разбирайте вывод du
, если доступно, вы можете, например, использовать stat
чтобы получить размер файла в байтах:
sizeA=$(stat -c%s "${fileA}")
size=$(wc -c < file)
Если вы хотите использовать du, я бы использовал встроенный bash read
:
read size filename < <(du file)
Обратите внимание, что вы не можете сказать, du file | read size filename
потому что в bash компоненты конвейера выполняются в подоболочках, поэтому переменные исчезнут при выходе из подоболочки.