1

我正在尝试从文件中提取大小(以 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

4 回答 4

3

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

 sizeA=$(du a | awk '{print $1}')
于 2013-08-02T09:00:15.037 回答
3

expr match不明白\s或其他扩展的正则表达式。试试'\([0-9]*\)'吧。

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

于 2013-08-02T09:08:20.937 回答
2

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

sizeA=$(stat -c%s "${fileA}")
于 2013-08-02T09:02:17.643 回答
2
size=$(wc -c < file)

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

read size filename < <(du file)

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

于 2013-08-02T09:21:13.810 回答