从我的本地服务器,我只能访问远程服务器的 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
,则最好使用而不是解析:stat
ssh
sftp
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}'
,然后简单地计算列数,直到找到您要查找的列。