我正在尝试使用 awk 命令剪切三列。
-rwxrwxr-x 1 rouser users 33 Oct 19 05:20 b.sh
我使用下面的行来削减 33 Oct 19 05:20 值。
z=`ls -l b.sh | awk '{print $6,$7,$8 }'`
echo $z
z 给出的结果为 33 Oct 19 05:20 。
我的问题是,我想要这种格式的日期、月份、年份 19/10/2016。
我应该怎么办??
请尽快帮助我。
答案1
关于解析输出的一些注意事项ls
:
- 格式取决于区域设置。如果需要解析它,则需要将语言环境修复为已知的内容,通常是
C
- 在
ls -l
输出中,由于用户名和组名出现在日期之前,并且可能包含空格(尽管在实践中很少见),因此您不能依赖日期始终位于第 6 个字段。最好使用ls -n
数字 uid/gid 代替(或者-o
,-g
使用具有它们的实现)。 - 如果文件是目录类型,
ls -l file
则会列出其内容。你想要这个-d
选项(LC_ALL=C ls -nd -- "$file"
到目前为止)。 如果文件名(或符号链接类型文件的符号链接的目标)包含换行符,那么您需要确保只考虑输出的第一行
LC_ALL=C ls -nd -- "$file" | awk '{print $6,$7,$8; exit}'
在 C 语言环境中,修改时间的格式会有所不同,具体取决于文件的最后一次修改是否是在过去 6 个月内(或将来)。所以你可以得到
Jun 14 09:18
orFeb 4 2014
orJan 1 2017
if 在 2016-11-09 运行。如果未给出年份,则您不能假设该年份是当前年份。例如,如果您在一月份运行它并得到一个Dec 24 23:59
,那么那就是去年的 12 月。
仍然可以像这样解决:
LC_ALL=C ls -dn -- "$file" | awk -v now="$(date +%m:%Y)" '{
m=$6; d=$7; y=$8
m = index("--JanFebMarAprMayJunJulAugSepOctNov", m) / 3
if (y ~ /:/) {
split(now, a, ":")
y = a[2]
if (m > a[1]) y--
}
printf "%02d/%02d/%04d\n", d, m, y
exit}'
但最好是从一开始就以正确的格式获取时间。通过zsh
,您可以使用它的stat
内置函数:
zmodload zsh/stat
stat -LF %d/%m/%Y +mtime -- $file
在 GNU 系统上,您可以执行以下操作:
date -r "$file" +%d/%m/%Y
(尽管对于符号链接,它为您提供了目标的修改时间)。
或者:
find -- "$file" -prune -printf '%Td/%Tm/%TY\n'
在 BSD 上:
stat -t %d/%m/%Y -f %Sm -- "$file"
或者用于perl
便携性:
perl -MPOSIX -le '@s = lstat shift or die "lstat: $!";
print strftime "%d/%m/%Y", localtime $s[9]' -- "$file"
答案2
如果你想使用ls
,你可以这样做: ls -l --time-style=+%d/%m/%Y