从 sftp 会话传回的“ls -l”输出中提取文件长度

从 sftp 会话传回的“ls -l”输出中提取文件长度

从我的本地服务器,我只能访问远程服务器的 stfp,我想在远程服务器上检查正在创建的备份文件的大小。所以我已经能够编写一些 bash 来登录并发出“ls -l”命令:

file_listing=$(sftp connection_string:Path/to <<<$'ls -l file.sql.gz')

...产生:

$ echo $file_listing
Changing to: /Path/to sftp> ls -l file.sql.gz -rw------- ? 19009 19009 7834147822 Oct 19 23:02 file.sql.gz

我希望能够使用 bash 本机字符串操作或 grep 或其他工具来提取该字符串的文件大小部分。在这种情况下7834147822

我尝试过 grepping,并尝试 grepping 来获取模式

size_pattern='([0-9]{1} {1}[0-9]+ {1}[A-Z]{1})'

或做...

echo $file_listing  | egrep -o '[[:digit:]]\{1\}[[:blank:]][[:digit:]]\+[[:blank:]][A-Z]\{1\}'

...或者其他的东西。我意识到,如果它有效的话,会给我“ 9 7834147822 O”,但我认为我什至可以管理字符串操作,在将其用作文件大小之前从两端删除一个字符和一个空格。

那有意义吗?有人有一些想法吗?

最好的祝愿,运动服

答案1

如果您不使用 引用变量echo,则所有内容都会打印在一行中。加上引号,你会更容易grep

不过,我还是更喜欢awk

echo "$file_listing"  | awk 'NR==3{print $5}'

另一种有趣的方法使用set

set -- $(tail -n1 <<< "$file_listing")
echo $5

请注意,如果您可以通过以下方式访问ls -l,则最好使用而不是解析:statsshsftp

ssh user@server 'stat --format %s /path/to/file'

答案2

如果您不喜欢awk,您可以使用标准工具的组合:

这两个命令是等效的:

echo "$file_listing"  | awk 'NR==3{print $5}'
echo "$file_listing"  | head -n3 | tail -n1 | tr -s ' ' '\t' | cut -f5
  • head并将tail打印前 3 行,以及这三行的最后一行。
  • tr将压缩所有重复的空格并用制表符替换它们。
  • 并且cut将打印第 5 个单词。

答案3

AWK 是您的朋友。 AWK 将查看一行文本,并根据遇到的空白将其分成几列。这些列中的每一列都有一个数字占位符 $1、$2 等。在我的机器上ls -l生成 9 列,此命令将获得您需要的内容。

ls -l file.sql.gz | awk '{print $5}'

如果您想要以 K / MB / GB 为单位的人类可读大小,请使用ls -lh

在您的示例中,文本行还包含诸如“更改为:...”之类的信息,您可以看到 AWK 正在接收的整行awk '{print $NF}',然后简单地计算列数,直到找到您要查找的列。

相关内容