AWK输出格式和语法

时间:2010-08-28 18:12:36

标签: linux syntax awk printf

我一直试图使用AWK对输出进行排序,并且已经非常成功地完成了堆栈溢出的一些事情,直到我点击下面命令的最后一部分。

-bash-3.2$ find /home/username/www/devdir -mindepth 2 -maxdepth 2 -type d -printf "%TY %Tm %Tb %Td,%TH:%TM,%p,\n" | grep "^$r" | grep Aug | sort -r | awk -F '/' '{print $1,$6","$7}' | awk -F " " '$1, { for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n"); }' | head -10
awk: $1, { for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n"); }
awk:     ^ syntax error

输出如下所示:

2010 08 Aug 28,11:51, Directory Tom,005,
2010 08 Aug 28,11:50, Directory Smith,004,
2010 08 Aug 28,11:46, Directory Jon,003,

我希望它看起来像:

2010 Aug 28,11:51, Directory Tom,005,
2010 Aug 28,11:50, Directory Smith,004,
2010 Aug 28,11:46, Directory Jon,003,

我想把它从中切掉“08”,有时候不会丢失之前完成的排序。这将改为下个月的09和下面的10,我相信我可以使用sed解决这个问题,但我不是它的专家。有人可以解释我应该采取什么措施来克服这个障碍吗?

我引用了这个问题来了解我需要做什么:Sorting output with awk, and formatting it

2 个答案:

答案 0 :(得分:1)

这部分想要完成什么?

awk -F " " '$1, { }'

我的意思是1美元,......

关于更新:

sed 's/^\([0-9]\+\) 08 \(.\+\)$/\1 \2/'

应该把它剪掉。

或更通用:

sed 's/^\([0-9]\+\) [0-9][0-9] \(.\+\)$/\1 \2/'

答案 1 :(得分:1)

您可以将您的greps组合成一个和所有awks,seds并将其整合到一个awk脚本中。由于您只需要一个月和一年的时间,因此您无需在%Tm中添加find,而且您实际上只按月份和时间排序。我假设$r是年份。

约:

find /home/username/www/devdir -mindepth 2 -maxdepth 2 -type d -printf "%TY %Tb %Td,%TH:%TM,%p,\n" | grep "^$r.*Aug" | sort -r | awk -F '/' 'NR<=10{print $1,$6","$7}'

顺便说一句,这就是你打算如何做的事情:

printf($1" ");for (i=3; i<=NF; i++) printf("%s ", $i); printf("\n")

您将显式打印第一个字段,而不是通过引用包含它。但是,使用上面的建议你不需要这样做。