如何在命令行中使用带有 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 部分,这显然是人类可读格式的大小。我想使用cutsed 来执行此操作,因为我不想使用比必要更复杂/难以使用的工具。

理想情况下,我希望它足够强大以处理大小附带的BMK 后缀,并相应地乘以110000001000。不过,我还没有找到一个好的方法。

我尝试了一些方法,但并不真正了解最佳方法:

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,然后再将人类可读的后缀(例如BMG)重新转换回单纯的字节计数(顺便说一句,乘数必须是1024 的倍数,而不是1000),只需在ls 命令中省略-h,默认输出原始字节数:ls -alt | awk 'print $5'

【讨论】:

ls -alth 中省略 -h 标志实际上是一个很棒的 ida。我没想到。【参考方案2】:

作为正确处理空格的 awk 解决方案的替代方案,还可以使用find 实用程序,它可以提供类似于ls 的结果。

实际上,您可以使用find 直接显示结果的大小,而无需任何其他工具/管道,例如cutawk

因此,仅列出您可以使用的字节:

$ 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 的正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

awk在正则表达式中的使用

正则表达式从带有空格分隔符和描述中的空格的行中读取发票行详细信息

带有熊猫列的正则表达式

正则表达式以及grep,cut等命令学习

打字稿:如何在 2 行中编写长正则表达式 [重复]

第二十三章 expect-正则表达式-sed-cut 的使用