Csh - 通过 xargs 中的 awk 获取字段
Csh - Fetching fields via awk inside xargs
我很难理解这种行为:
脚本行为:读取文件(包含日期);打印多级目录树中的文件列表并获取它们的大小,仅打印文件大小,(后续步骤:总文件大小)。
开始脚本:
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | head"
2000-03:
1000 /folder/2000-03balbasldas
2000-04:
12300 /folder/2000-04asdwqdas
[and so on]
但是当我尝试在第一个字段上通过 awk 进行过滤时,我仍然得到整行
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print }'"
2000-03:
1000 /folder/2000-03balbasldas
2000-04:
12300 /folder/2000-04asdwqdas
我已经通过 divide-et-impera 解决了它,下面的命令工作正常很好:
du -d 2 "/folder/" | grep '2000-03' | awk '{print }'
1000
恐怕我遗漏了一些非常微不足道的东西,但到目前为止我还没有找到任何东西。
有什么想法吗?谢谢!
输入:包含名为YYYY-MM-random_data的文件夹和包含字符串的文件的目录:
ls -l
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-03-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-04-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-05-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablb
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablc
[...]
cat dates
2000-03
2000-04
2000-05
[...]
预期输出:文件夹中所有文件占用的磁盘总和 space,其名称包含文件中的字符串 dates
2000-03: 1000
2000-04: 2123
2000-05: 1222112
[...]
======
但特别是,我对为什么 awk 无法获取我要求的列 $1 感兴趣。
好吧,经过大量研究,我似乎自己找到了答案:D
我将 post 放在这里,希望它能帮助其他人。
诀窍是避开 $ 符号。
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print $1}'"
使用 GNU Parallel 看起来像这样:
parallel --tag "eval du -s folder/{}* | perl -ne '"'$s+=$_ ; END {print "$s\n"}'"'" :::: dates
--tag
在行前加上日期。
{}
替换为日期。
eval du -s folder/{}*
查找所有以日期开头的目录,并给出这些目录的总数 du
。
perl -ne '$s+=$_ ; END {print "$s\n"}'
汇总 du
的输出
最后有一点引用技巧来正确引用它。
我很难理解这种行为:
脚本行为:读取文件(包含日期);打印多级目录树中的文件列表并获取它们的大小,仅打印文件大小,(后续步骤:总文件大小)。
开始脚本:
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | head"
2000-03:
1000 /folder/2000-03balbasldas
2000-04:
12300 /folder/2000-04asdwqdas
[and so on]
但是当我尝试在第一个字段上通过 awk 进行过滤时,我仍然得到整行
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print }'"
2000-03:
1000 /folder/2000-03balbasldas
2000-04:
12300 /folder/2000-04asdwqdas
我已经通过 divide-et-impera 解决了它,下面的命令工作正常很好:
du -d 2 "/folder/" | grep '2000-03' | awk '{print }'
1000
恐怕我遗漏了一些非常微不足道的东西,但到目前为止我还没有找到任何东西。
有什么想法吗?谢谢!
输入:包含名为YYYY-MM-random_data的文件夹和包含字符串的文件的目录:
ls -l
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-03-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-04-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-05-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablabla
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablb
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablc
[...]
cat dates
2000-03
2000-04
2000-05
[...]
预期输出:文件夹中所有文件占用的磁盘总和 space,其名称包含文件中的字符串 dates
2000-03: 1000
2000-04: 2123
2000-05: 1222112
[...]
====== 但特别是,我对为什么 awk 无法获取我要求的列 $1 感兴趣。
好吧,经过大量研究,我似乎自己找到了答案:D 我将 post 放在这里,希望它能帮助其他人。
诀窍是避开 $ 符号。
cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print $1}'"
使用 GNU Parallel 看起来像这样:
parallel --tag "eval du -s folder/{}* | perl -ne '"'$s+=$_ ; END {print "$s\n"}'"'" :::: dates
--tag
在行前加上日期。
{}
替换为日期。
eval du -s folder/{}*
查找所有以日期开头的目录,并给出这些目录的总数 du
。
perl -ne '$s+=$_ ; END {print "$s\n"}'
汇总 du
最后有一点引用技巧来正确引用它。