我正在尝试从文件中提取大小(以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]*\)'
但是这样它会捕获所有文本。有什么想法吗?
答案 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退出时变量将消失。