Регулярное выражение сценария 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 компоненты конвейера выполняются в подоболочках, поэтому переменные исчезнут при выходе из подоболочки.

Другие вопросы по тегам