当在引号内找到字段分隔符时,不要分隔字段
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
我有这个命令的输出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