如何提取长列表字段?

如何提取长列表字段?

我想在 shell 脚本中提取文件的访问日。我尝试编写以下脚本,但它不起作用。当我回声时访问日,输出是“staff”。

file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)

答案1

不解析ls

这是一份工作stat

要以人类可读的格式获取上次访问时间:

stat -c '%x' file.txt

自纪元以来的秒数:

stat -c '%X' file.txt

答案2

如果你看一下 的典型输出ls -lu

-rw-r--r--  1 someuser  somegroup  74 Mar 29 05:21 filename

您会注意到组名称前面总共有五个空格字符。因此,您在命令中指定的字段 6cut将返回组(在您的情况下为“staff”)。

另外,访问日将是字段 7,而不是符号中的 6。

一种解决方案是使用awk,因为它会按照您默认的方式处理字段分隔符的多次出现:

accessday=$(ls -lu $file | awk '{print $7}')

答案3

根据您的问题,我将使用 stat 标准化输出,然后剪切为仅显示您想要的日期。

stat -c '%x' FILENAME | cut -c 9,10

答案4

ls解析is的输出困难且并不总是可能。如果您想提取时间戳,有时这是必要的后备(这是唯一可移植的方法:并非所有系统都有命令stat),但您会得到一个人类可读的时间戳,即很难转换为机器可读的。至少解决困难的部分:传递-o-g选项以省略用户和组字段(这些字段在某些系统上可能包含空格,从而无法在 的输出中进行分隔ls)。那么时间戳占据字段4-6(从1开始编号)。

不要忘记变量扩展周围的双引号

access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')

如果你想要一个月中的某一天,你需要区分两种输出格式,是否是过去 6 个月内的时间戳。将语言环境设置为 C 以获得可靠的输出格式。在此格式中,月份中的日期始终是第二个时间戳字段。

access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')

相关内容