Bash脚本正则表达式的文件大小

时间:2013-08-02 08:55:13

标签: regex bash solaris

我正在尝试从文件中提取大小(以kb为单位)。试着这样做:

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 个答案:

答案 0 :(得分:3)

不是直接的答案,但我会这样做:

 sizeA=$(du a | awk '{print $1}')

答案 1 :(得分:3)

我的expr match无法理解\s或其他扩展的正则表达式。请改为'\([0-9]*\)'

但正如其他人已经提到的那样,使用正则表达式获得“第一个字”有点矫枉过正。我使用du s | { read a b; echo $a; },但您也可以使用awk版本或使用cut的解决方案。

答案 2 :(得分:2)

请勿解析du的输出,如果可用,您可以例如使用stat以字节为单位获取文件的大小:

sizeA=$(stat -c%s "${fileA}")

答案 3 :(得分:2)

size=$(wc -c < file)

如果你想使用du,我会使用bash内置read

read size filename < <(du file)

请注意,您不能说du file | read size filename,因为在bash中,管道的组件在子shell中执行,因此当子shell退出时变量将消失。