如何在命令行中使用带有 cut 的正则表达式?
Posted
技术标签:
【中文标题】如何在命令行中使用带有 cut 的正则表达式?【英文标题】:How to use regex with cut at the command line? 【发布时间】:2017-09-04 20:37:24 【问题描述】:我有一些来自ls -alth
的输出:
drwxr-xr-x 5 root admin 170B Aug 3 2016 ..
drwxr-xr-x 5 root admin 70B Aug 3 2016 ..
drwxr-xr-x 5 root admin 3B Aug 3 2016 ..
drwxr-xr-x 5 root admin 9M Aug 3 2016 ..
现在,我想解析出170B
部分,这显然是人类可读格式的大小。我想使用cut
或sed
来执行此操作,因为我不想使用比必要更复杂/难以使用的工具。
理想情况下,我希望它足够强大以处理大小附带的B
、M
或K
后缀,并相应地乘以1
、1000000
和1000
。不过,我还没有找到一个好的方法。
我尝试了一些方法,但并不真正了解最佳方法:
ls -alth | cut -f 5 -d \s+
我希望这会奏效,因为我可以将其分隔在一个或多个空格上。
但这不起作用。如何为cut
提供正则表达式分隔符?或者有没有更简单的方法从ls -alth
中提取文件的大小?
我使用的是 CentOS6.4
【问题讨论】:
为什么不只是ls -alth |cut -d" " -f5
..?
我实际上从未听说过这个选项。这不起作用,因为它需要在任意数量的空间上拆分。您的示例仅在一个空格上拆分。我在问题中添加了更多示例行以使其更加清晰。
好吧……那ls -alth |awk 'print $5'
呢?默认情况下,这适用于任何空白。顺便说一句,即使在我的 Debian 中使用 cut 也可以。
我试图避开awk
,因为它对我来说是一个不熟悉的工具。不过这可能会奏效。请给我写一个完整的答案,看看你有条理的思考过程以及权衡。
【参考方案1】:
此答案解决了所问问题,但将George Vasiliou's helpful find
solution 视为潜在的更好选择。
cut
仅支持 单个,文字字符作为分隔符 (-d
),因此不适合使用。
对于提取每行用可变数量的空格分隔的标记(字段),awk
是最好的工具,因此George Vasiliou 提出的解决方案是最简单的:@987654327 @
提取第 5 个空格分隔的字段 ($5
),即大小。
而不是先使用-h
,然后再将人类可读的后缀(例如B
、M
和G
)重新转换回单纯的字节计数(顺便说一句,乘数必须是1024
的倍数,而不是1000
),只需在ls
命令中省略-h
,默认输出原始字节数:ls -alt | awk 'print $5'
【讨论】:
从ls -alth
中省略 -h
标志实际上是一个很棒的 ida。我没想到。【参考方案2】:
作为正确处理空格的 awk 解决方案的替代方案,还可以使用find
实用程序,它可以提供类似于ls
的结果。
实际上,您可以使用find
直接显示结果的大小,而无需任何其他工具/管道,例如cut
或awk
。
因此,仅列出您可以使用的字节:
$ find . -maxdepth 1 -printf %s\\n
173
3
684
您可以在 find 中结合文件名 + 字节与
$ find . -maxdepth 1 -printf %f-%s\\n
bsd.txt-173
file4-3
shellcolors.sh-684
您可以咨询man find
以查看-printf
下的许多可用选项。
此外,通过删除-maxdepth
选项,您还可以获得子目录中所有文件的列表。
另一种选择是使用du
实用程序,它能够以人类可读的格式提供结果:
$ du -a -b -h -d1
1.9M ./appsfiles
173 ./bsd.txt
3 ./file4
684 ./shellcolors.sh
-a
:所有文件和目录。去掉这个选项只得到目录大小-b
: 报告文件的实际大小 - 去掉这个选项将报告这个文件占用的磁盘大小(即一个3 kB的文件实际占用4K)@ 987654335@:人类可读尺寸-d1
:深度1
你可以用|cut -d" " -f1
或者|awk 'print $1'
进一步解析du的结果
【讨论】:
【参考方案3】:我对不得不查找 awk(ward) 语法并编写自己的语法感到恼火:
https://www.npmjs.com/package/cutr
安装
npm i -g cutr
ls --full-time | cutr -d ' +' -f 6-
或使用类似的东西运行
ls --full-time | npx cutr -d ' +' -f 6-
你的命令可能是
ls -alth | cutr -f 5 -d '\s+'
【讨论】:
以上是关于如何在命令行中使用带有 cut 的正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章