有人可以分解这个 unix grep 和 awk 语句吗?

有人可以分解这个 unix grep 和 awk 语句吗?

有人可以打破这个说法吗?

sFileName=`ls -lrt $sTmpPath/$1* | grep ^- | grep -v grep |  head -1 | awk 'BEGIN { FS="/" } { print $NF }'`

这里

  1. $sTmpPath包含 UNIX 服务器中的任何临时路径。
  2. 传递的第一个参数是文件名。

谢谢
高塔姆

答案1

  • ls -lrt:列出其非目录参数和内容其目录参数的格式为long 格式,按r相反t时​​间(修改时间)顺序(从最旧到最新)。本来应该ls -lrtd --
  • $sTmpPath/$1*: 应该是"$sTmpPath/$1"*: 的目的是列出名称$sTmpPath以我认为开头的文件$1
  • grep ^-。更好的是grep '^-' 因为^在几个贝壳中很特别。保留以 开头的行-。在 的输出中ls -l,这是以下行常规的文件,排除任何其他类型的文件(目录、符号链接、套接字...)。如果某些文件名或符号链接目标包含换行符,它也可能会给出误报。
  • grep -v grep。排除包含grep.也许写这篇文章的人正在考虑这个ps | grep -v grep技巧。这里没有意义。
  • head -1。的古代形式head -n 1:选择输入的第一行。所以最旧的匹配文件的行。
  • BEGIN{FS = "/"}:将 awk 字段分隔符设置为/.你宁愿用-F/它。
  • {print $NF}:打印最后一个/分隔字段,即最后一个之后的行部分/,即文件名。请注意,awk可以完成grepandhead的工作。

因此,该脚本的目的似乎是报告$sTmpPath名称以$1.

可以将其简化并部分修正为:

ls -nrtd -- "$sTmpPath/$1"* | awk -F/ '/^-/ {print $NF; exit}'

这里使用-n而不是-l避免将 uid/gids 不必要地转换为用户名/组名。

请注意,它假设文件名或符号链接目标都不包含换行符。

有了zsh,您只需使用oldest=($sTmpPath/$1*(.Om[1]:t)).

相关内容