我正在通过awk解析SFTP'ls -l'输出,以仅打印现有目录的结果(是的,我知道Python更好,而ls的解析不是一个好主意,这是任务的技术限制)。这是我收到的输出:
bash-3.2$ sftp my-server < batch_ls.sftp | gawk 'BEGIN{d=-1;wd=1}/^sftp> c/{d++;wd=0}/Coul/{wd=1}wd==0{print $0,d,wd}'
Connecting to my-server...
sftp> cd /ik/sftp_source/alpha 0 0
sftp> ls -l 0 0
drwxr-xr-x 2 65740 102 4096 Mar 21 05:15 . 0 0
drwxr-xr-x 4 65740 102 4096 Mar 21 04:21 .. 0 0
-rw-r--r-- 1 65740 102 35 Mar 21 05:15 0452984832A8.234 0 0
-rw-r--r-- 1 65740 102 34 Mar 21 05:15 0989855744A8.234 0 0
-rw-r--r-- 1 65740 102 35 Mar 21 05:15 1258291200A8.234 0 0
-rw-r--r-- 1 65740 102 34 Mar 21 05:15 1862270976A8.234 0 0
sftp> cd /ik/sftp_source/belta 1 0
Couldn't canonicalise: No such file or directory
sftp> ls -l 1 0
drwxr-xr-x 2 65740 102 4096 Mar 21 05:15 . 1 0
drwxr-xr-x 4 65740 102 4096 Mar 21 04:21 .. 1 0
-rw-r--r-- 1 65740 102 35 Mar 21 05:15 0452984832A8.234 1 0
-rw-r--r-- 1 65740 102 34 Mar 21 05:15 0989855744A8.234 1 0
-rw-r--r-- 1 65740 102 35 Mar 21 05:15 1258291200A8.234 1 0
-rw-r--r-- 1 65740 102 34 Mar 21 05:15 1862270976A8.234 1 0
sftp> cd /ik/sftp_source/delta 2 0
sftp> ls -l 2 0
drwxr-xr-x 2 65740 102 4096 Mar 21 05:15 . 2 0
drwxr-xr-x 4 65740 102 4096 Mar 21 04:21 .. 2 0
-rw-r--r-- 1 65740 102 34 Mar 21 05:15 0335544320A8.234 2 0
-rw-r--r-- 1 65740 102 35 Mar 21 05:15 0419430400A8.234 2 0
-rw-r--r-- 1 65740 102 35 Mar 21 05:15 1073741824A8.234 2 0
-rw-r--r-- 1 65740 102 34 Mar 21 05:15 1392508928A8.234 2 0
这里:
d 是目录计数器
wd 是一个标志,要知道我们正在处理正确目录的输出,还是无法“ cd”需要的目录,而我们仍在前一个目录中。 p>
看起来它没有捕获字符串的“无法”部分。谁能帮助我提出更好的解决方案,并解释为什么会发生这种情况?非常感谢!
PS 注意,“ Canon't canonicalise ...”行的末尾没有d和wd值。
答案 0 :(得分:4)
管道后面的命令部分看不到那些行,因为您正在重定向stdout
,但是sftp
会将错误发送到stderr
。
如果要将它们都重定向到gawk
,则应在命令中添加2>&1
:
bash-3.2$ sftp my-server < batch_ls.sftp 2>&1 | gawk 'BEGIN{d=-1;wd=1}/^sftp> c/{d++;wd=0}/Coul/{wd=1}wd==0{print $0,d,wd}'