当在引号内找到字段分隔符时,不要分隔字段

Don't field separate when a field separator is found inside of quotes

我有这个命令的输出ls -lhp --group-directories-first:

drwxrwxr-x 2 aName aName 4.0K Jan 11 18:46  Desktop/
drwxr-xr-x 3 aName aName 4.0K Jan 13 16:43  Documents/
drwxr-xr-x 2 aName aName 4.0K Jan 12 18:47  Downloads/
drwxr-xr-x 2 aName aName 4.0K Jan 11 16:08  Music/
-rw-rw-r-- 1 aName aName 4.6M Jan 14 11:28 '2021-01-14 11-28-39.mov'
-rw-rw-r-- 1 aName aName 2.2M Jan 14 11:55 '2021-01-14 11-55-20.mkv'

我只想拥有这个:

Desktop/ 4.0K
Documents/ 4.0K
Downloads/ 4.0K
Music/ 4.0K
'2021-01-14 11-28-39.mov' 4.6M
'2021-01-14 11-55-20.mkv' 2.2M

所以我可以 awk 仅第 9 列和第 5 列:

ls -lhp --group-directories-first | awk -F' ' '{print  " " }'

但是当文件名包含 space 时,它的字段会分开并且 space 之后的所有内容都将丢失。

感谢您的智慧和时间!

只需使用正确的选项:

ls -1shp --group-directories-first

-s 列出尺寸和 -1,每行一个条目。

如果您需要文件名后的大小计数,请将其通过管道传输到 awk '{$(NF+1)=; =""}1

使用查找和 printf:

find . -maxdepth 1 -printf "'%f' %k\n"

打印单引号括起的文件名 %f 以及 files/directories (%k)

的 1k 块大小

您需要设置正确的分隔符,使用 GNU awk,您可以使用 FPAT 来正确分隔可能用单引号引起来的空格分隔字段:

ls -lhp --group-directories-first | \
  awk 'BEGIN{FPAT="[^[:space:]'"'"']+|'"'"'[^'"'"']+'"'"'"} {print " "}'

引号看起来很乱,但这就是字符串连接的工作原理,你只需将 '...'"..." 放在一起,实际上模式是 [^[:space:]']+|'[^']+' 并且它比赛

  • [^[:space:]']+ - 除了空格和 '
  • 之外的一个或多个字符
  • | - 或
  • '[^']+' - ',除 ' 之外的一个或多个字符,然后是 ' 个字符。

参见 online demo:

s="drwxrwxr-x 2 aName aName 4.0K Jan 11 18:46  Desktop/
drwxr-xr-x 3 aName aName 4.0K Jan 13 16:43  Documents/
drwxr-xr-x 2 aName aName 4.0K Jan 12 18:47  Downloads/
drwxr-xr-x 2 aName aName 4.0K Jan 11 16:08  Music/
w-rw-r--> -rw-rw-r-- 1 aName aName 4.6M Jan 14 11:28 '2021-01-14 11-28-39.mov'
-rw-rw-r-- 1 aName aName 2.2M Jan 14 11:55 '2021-01-14 11-55-20.mkv'"
 awk 'BEGIN{FPAT="[^[:space:]'"'"']+|'"'"'[^'"'"']+'"'"'"} {print " "}' <<< "$s"

输出:

Desktop/ 4.0K
Documents/ 4.0K
Downloads/ 4.0K
Music/ 4.0K
11:28 aName
'2021-01-14 11-55-20.mkv' 2.2M

你可以试试这个awk

 ls -lhp --group-directories-first | awk -F' ' 'NR <= 4 {print , } NR > 4 {print ,, }'

result:

Desktop/ 4.0K
Documents/ 4.0K
Downloads/ 4.0K
Music/ 4.0K
'2021-01-14 11-28-39.mov' 4.6M
'2021-01-14 11-55-20.mkv' 2.2M