oc rsh + awk 在每行的开头打印额外的缩进,似乎只做了换行但没有 return 回车

oc rsh + awk prints extra indentation at beginning of each line, seems only did line break but does not return carriage

我想像这样过滤 oc rsh du -shc 输出行:

oc rsh broker-amq-1-2-fsbnd du -shc / 2>&1 | awk '=="total" {print }'

但是我没有得到任何结果。对于本地 du -shc /some/dir 2>&1 我得到了想要的输出。

# locally
$  du -shc ~ 2>&1
du: cannot read directory '/home/xxxx/.cache/doc': Permission denied
du: cannot read directory '/home/xxxx/.cache/dconf': Permission denied
du: cannot read directory '/home/xxxx/.gvfs': Permission denied
52G /home/xxxx/
52G total

和过滤:

# filtering works; search the 2nd arg "total" and print arg 1
$  du -shc ~ 2>&1 | awk '=="total" {print }' 
52G

并打印:

$ du -shc ~ 2>&1 | awk '{print }'
du:
du:
du:
52G
52G

和 2 美元:

$ du -shc ~ 2>&1 | awk '{print }'
cannot
cannot
cannot
/home/xxx
total

但远程:

oc rsh broker-amq-1-2-fsbnd du -shc / 2>&1 | awk '=="total" {print }'
# no output

如果我不使用 awk:

$ oc rsh broker-amq-1-2-fsbnd du -shc / 2>&1
du: cannot read directory '/proc/tty/driver': Permission denied
du: cannot read directory '/proc/acpi': Permission denied
du: cannot read directory '/proc/scsi': Permission denied
du: cannot access '/proc/130224/task/130224/fd/3': No such file or directory
du: cannot access '/proc/130224/task/130224/fdinfo/3': No such file or directory
du: cannot access '/proc/130224/fd/4': No such file or directory
du: cannot access '/proc/130224/fdinfo/4': No such file or directory
du: cannot read directory '/run/cryptsetup': Permission denied
du: cannot read directory '/run/secrets/rhsm': Permission denied
du: cannot read directory '/sys/firmware': Permission denied
du: cannot read directory '/var/lib/yum/history/2021-12-02/1': Permission denied
du: cannot read directory '/var/lib/yum/history/2021-12-02/2': Permission denied
du: cannot read directory '/var/lib/yum/history/2021-12-02/4': Permission denied
du: cannot read directory '/var/lib/yum/history/2021-12-02/3': Permission denied
du: cannot read directory '/var/lib/machines': Permission denied
du: cannot read directory '/var/cache/ldconfig': Permission denied
1.8G    /
1.8G    total
command terminated with exit code 1

而且,如果我只打印 </code>:</p> <pre><code>$ oc rsh broker-amq-1-2-fsbnd du -shc / 2>&1 | awk '{print }' du: du: du: du: du: du: du: du: du: du: du: du: du: du: du: du: 1.8G 1.8G command

为什么会有多余的缩进?似乎只换行了,但没有 return 到行首的回车???

如果我打印</code>,我们可以看到最后的两行是对齐的;这里有什么问题?</p> <pre><code>$ oc rsh broker-amq-1-2-fsbnd du -shc / 2>&1 | awk '{print }' cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot cannot / total terminated

本地 awk 版本是:

GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2016 Free Software Foundation.

,远程,openshift awk 版本是

GNU Awk 4.0.2
Copyright (C) 1989, 1991-2012 Free Software Foundation.

本地du版本为

du (GNU coreutils) 8.28
Copyright (C) 2017 Free Software Foundation, Inc.

,远程时,openshift pod du 版本为

du (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.

看来远程版本比本地版本差很多,注意版权年份。

根据@Ed Morton 的要求:

$ oc rsh broker-amq-1-15-snd64 du -shc / 2>/dev/null | od -c
0000000   d   u   :       c   a   n   n   o   t       r   e   a   d    
                                                                       0000020   d   i   r   e   c   t   o   r   y       '   /   p   r   o   c
                                                                                                                                              0000040   /   t   t   y   /   d   r   i   v   e   r   '   :       P   e
                       0000060   r   m   i   s   s   i   o   n       d   e   n   i   e   d  \r
                                                                                              0000100  \n   d   u   :       c   a   n   n   o   t       r   e   a   d
                                                                                                                                                                     0000120       d   i   r   e   c   t   o   r   y       '   /   p   r   o
                                              0000140   c   /   a   c   p   i   '   :       P   e   r   m   i   s   s
                                                                                                                     0000160   i   o   n       d   e   n   i   e   d  \r  \n   d   u   :    
                                                                                                                                                                                            0000200   c   a   n   n   o   t       r   e   a   d       d   i   r   e
                                                                     0000220   c   t   o   r   y       '   /   p   r   o   c   /   s   c   s
                                                                                                                                            0000240   i   '   :       P   e   r   m   i   s   s   i   o   n       d
                     0000260   e   n   i   e   d  \r  \n   d   u   :       c   a   n   n   o
                                                                                            0000300   t       a   c   c   e   s   s       '   /   p   r   o   c   /
                                                                                                                                                                   0000320   2   8   7   2   7   /   t   a   s   k   /   2   8   7   2   7
                                            0000340   /   f   d   /   3   '   :       N   o       s   u   c   h    
                                                                                                                   0000360   f   i   l   e       o   r       d   i   r   e   c   t   o   r
                                                                                                                                                                                          0000400   y  \r  \n   d   u   :       c   a   n   n   o   t       a   c
                                                                   0000420   c   e   s   s       '   /   p   r   o   c   /   2   8   7   2
                                                                                                                                          0000440   7   /   t   a   s   k   /   2   8   7   2   7   /   f   d   i
                   0000460   n   f   o   /   3   '   :       N   o       s   u   c   h    
                                                                                          0000500   f   i   l   e       o   r       d   i   r   e   c   t   o   r
                                                                                                                                                                 0000520   y  \r  \n   d   u   :       c   a   n   n   o   t       a   c
                                          0000540   c   e   s   s       '   /   p   r   o   c   /   2   8   7   2
                                                                                                                 0000560   7   /   f   d   /   4   '   :       N   o       s   u   c   h
                                                                                                                                                                                        0000600       f   i   l   e       o   r       d   i   r   e   c   t   o
                                                                 0000620   r   y  \r  \n   d   u   :       c   a   n   n   o   t       a
                                                                                                                                        0000640   c   c   e   s   s       '   /   p   r   o   c   /   2   8   7
                 0000660   2   7   /   f   d   i   n   f   o   /   4   '   :       N   o
                                                                                        0000700       s   u   c   h       f   i   l   e       o   r       d   i
                                                                                                                                                               0000720   r   e   c   t   o   r   y  \r  \n   d   u   :       c   a   n
                                        0000740   n   o   t       r   e   a   d       d   i   r   e   c   t   o
                                                                                                               0000760   r   y       '   /   r   u   n   /   c   r   y   p   t   s   e
                                                                                                                                                                                      0001000   t   u   p   '   :       P   e   r   m   i   s   s   i   o   n
                                                               0001020       d   e   n   i   e   d  \r  \n   d   u   :       c   a   n
                                                                                                                                      0001040   n   o   t       r   e   a   d       d   i   r   e   c   t   o
               0001060   r   y       '   /   r   u   n   /   s   e   c   r   e   t   s
                                                                                      0001100   /   r   h   s   m   '   :       P   e   r   m   i   s   s   i
                                                                                                                                                             0001120   o   n       d   e   n   i   e   d  \r  \n   d   u   :       c
                                      0001140   a   n   n   o   t       r   e   a   d       d   i   r   e   c
                                                                                                             0001160   t   o   r   y       '   /   s   y   s   /   f   i   r   m   w
                                                                                                                                                                                    0001200   a   r   e   '   :       P   e   r   m   i   s   s   i   o   n
                                                             0001220       d   e   n   i   e   d  \r  \n   d   u   :       c   a   n
                                                                                                                                    0001240   n   o   t       r   e   a   d       d   i   r   e   c   t   o
             0001260   r   y       '   /   v   a   r   /   l   i   b   /   y   u   m
                                                                                    0001300   /   h   i   s   t   o   r   y   /   2   0   2   1   -   0   1
                                                                                                                                                           0001320   -   2   6   /   1   '   :       P   e   r   m   i   s   s   i
                                    0001340   o   n       d   e   n   i   e   d  \r  \n   d   u   :       c
                                                                                                           0001360   a   n   n   o   t       r   e   a   d       d   i   r   e   c
                                                                                                                                                                                  0001400   t   o   r   y       '   /   v   a   r   /   l   i   b   /   y
                                                           0001420   u   m   /   h   i   s   t   o   r   y   /   2   0   2   1   -
                                                                                                                                  0001440   0   1   -   2   6   /   2   '   :       P   e   r   m   i   s
           0001460   s   i   o   n       d   e   n   i   e   d  \r  \n   d   u   :
                                                                                  0001500       c   a   n   n   o   t       r   e   a   d       d   i   r
                                                                                                                                                         0001520   e   c   t   o   r   y       '   /   v   a   r   /   l   i   b
                                  0001540   /   y   u   m   /   h   i   s   t   o   r   y   /   2   0   2
                                                                                                         0001560   1   -   0   1   -   2   6   /   4   '   :       P   e   r   m
                                                                                                                                                                                0001600   i   s   s   i   o   n       d   e   n   i   e   d  \r  \n   d
                                                         0001620   u   :       c   a   n   n   o   t       r   e   a   d       d
                                                                                                                                0001640   i   r   e   c   t   o   r   y       '   /   v   a   r   /   l
         0001660   i   b   /   y   u   m   /   h   i   s   t   o   r   y   /   2
                                                                                0001700   0   2   1   -   0   1   -   2   6   /   3   '   :       P   e
                                                                                                                                                       0001720   r   m   i   s   s   i   o   n       d   e   n   i   e   d  \r
                                0001740  \n   d   u   :       c   a   n   n   o   t       r   e   a   d
                                                                                                       0001760       d   i   r   e   c   t   o   r   y       '   /   v   a   r
                                                                                                                                                                              0002000   /   l   i   b   /   m   a   c   h   i   n   e   s   '   :    
                                                       0002020   P   e   r   m   i   s   s   i   o   n       d   e   n   i   e
                                                                                                                              0002040   d  \r  \n   d   u   :       c   a   n   n   o   t       r   e
       0002060   a   d       d   i   r   e   c   t   o   r   y       '   /   v
                                                                              0002100   a   r   /   c   a   c   h   e   /   l   d   c   o   n   f   i
                                                                                                                                                     0002120   g   '   :       P   e   r   m   i   s   s   i   o   n       d
                              0002140   e   n   i   e   d  \r  \n   3   .   7   G  \t   /  \r  \n   3
                                                                                                     0002160   .   7   G  \t   t   o   t   a   l  \r  \n
0002173
xxxxxxx@elxag5zs8d3:~

和:

$ oc rsh broker-amq-1-15-snd64 du -shc / 2>/dev/null | awk '{print }' | od -c
0000000   d   u   :  \n   d   u   :  \n   d   u   :  \n   d   u   :  \n
*
0000100   3   .   7   G  \n   3   .   7   G  \n
0000112

如果我改变 RS,我会得到奇怪的结果。

$ oc rsh broker-amq-1-15-snd64 du -shc / 2>/dev/null | awk 'BEGIN {RS="\r\n";} {print }'
du:
   du:
      du:
         du:
            du:
               du:
                  du:
                     du:
                        du:
                           du:
                              du:
                                 du:
                                    du:
                                       du:
                                          du:
                                             du:
                                                3.7G
                                                    3.7G
                                                        xxxxxx@elxag5zs8d3:~ 

很奇怪,您的 oc rsh broker-amq-1-15-snd64 du -shc / 2>/dev/null | od -c 输出没有显示空格或制表符,例如在 cannotread 之间:

0000000 d u : c a n n o t r e a d

而没有od -c,即当你运行 oc rsh broker-amq-1-2-fsbnd du -shc / 2>&1时,显然有空白:

du: cannot read directory '/proc/tty/driver': Permission denied

无论如何,如 oc rsh broker-amq-1-15-snd64 du -shc / 2>/dev/null | od -c 输出所示,您的输出行以 \r\n 结尾,例如(强调我的):

0000000 d u : c a n n o t r e a d
0000020 d i r e c t o r y ' / p r o c
0000040 / t t y / d r i v e r ' : P e
0000060 r m i s s i o n d e n i e d **\r
0000100 \n** d u : c a n n o t r e a d
0000120 d i r e c t o r y ' / p r o
0000140 c / a c p i ' : P e r m i s s
0000160 i o n d e n i e d **\r \n**

您提到本地 du 输出以 \n 结尾的行,所以这只是意味着它可能是 rshoc 正在将其更改为 \r\n -尝试使用 oc rsh broker-amq-1-15-snd64 date 等其他命令进行验证。

无论如何,为了简单和便携地处理它,并假设您实际上不希望在最终输出中使用 \r\n 行结尾,请将您的 awk 脚本更改为:

awk '=="total" {print }'

在对输入进行任何其他操作之前删除每行末尾的 \r

awk '{sub(/\r$/,"")} =="total" {print }'

你没有得到 =="total" 输出的原因是给定的输入如:

foo total\r\n

$2 不是 "total",而是 "total\r",因此比较失败。

您提到设置 ORS="\r\n" 以获得所需的输出 - 不,这只会将问题传播到下一个命令。

您可以设置 RS="\r\n" 但这只适用于接受 multi-char RS 的 awk,例如GNU awk,在其他 awk 中,根据 POSIX 标准,RS 是单个字符,将被视为与 RS="\r" 相同。

有一些平台在检测到 \r\n 输入时:

  1. \r 会自动被 awk 调用以读取输入的底层 C 原语剥离,或者
  2. RS 自动设置为 \r\n

所以请注意这一点并检查 awk 实际获得的输入以及 RSORS 设置的内容(如果上面的 sub() 没有执行您想要的操作) (awk 'NR==1{ print "[=43=]=<"[=43=]">" ORS "RS=<"RS">" ORS "ORS=<"ORS">"; exit }' | od -c 应该告诉你所有你需要知道的)。

有关详细信息,请参阅

为了完整起见,作为旁注:

oc rsh 似乎总是在输出后附加 CRLF,并且有一些关于此的错误报告,请参阅 https://bugzilla.redhat.com/show_bug.cgi?id=1668763 and https://bugzilla.redhat.com/show_bug.cgi?id=1638447。它说 oc rsh 需要一个 pseudo-terminal 和选项 --no-tty=true 它不会附加 CRLF。同时 oc exec 不会附加 CRLF。它似乎来自 docker 两者都依赖的术语。

This would most likely have to be a patch made against the docker term[1] package, which the rsh and exec commands depend on.

[1]. https://github.com/moby/moby/tree/master/pkg/term

所以,下面的两种形式之后不需要再剥离\r,同时执行后也不会引入额外的缩进(xxxxxx@localhost:~之前):

oc exec broker-amq-1-15-snd64 -- du -shc / 2>/dev/null | awk '=="total" {print }'
3.6G
xxxxxx@localhost:~

或:

oc rsh --no-tty=true broker-amq-1-15-snd64 du -shc / 2>/dev/null | awk '=="total" {print }'
3.6G
xxxxxx@localhost:~

注意 exec 你需要 --.

也许是一种解决方案,既不涉及强制 oc(或任何其他应用程序)改变它的 line-ending 行为,也不必捏造 FSRS

gawk -te 'NF=/total?$/'
19G

测试并确认在 mawk 1.3.4mawk 1.9.9.6macos nawkgawk 5.1.1 上工作,包括调用标志 -c/-P/-t/-S

我会使用 \r 而不是 </code>,但是 <code>gawk -t 传统模式抱怨 \r 不可用,所以 </code> 会最便携的解决方案</p> <p>但是如果你不需要<code>gawk -t兼容性并且不介意捏造FS,那么

nawk NF=NF==2 FS='\ttotal\r?'
or
mawk -— —-NF FS='\ttotal\r?'

甚至

mawk 'NF=!+FS<NF' FS='total$' RS='\r?\n' 

-- The 4Chan Teller