为何awk处理ssh -V输出与echo输入时结果不一致?
问题:ssh -V输出通过awk处理无法正确分割字段
尝试用awk指定字段分隔符_提取第一个字段时,遇到以下异常情况:
- 直接通过管道处理
ssh -V的输出,两种awk写法都无法得到预期结果,终端仍显示完整的版本字符串 - 用echo输出相同字符串再管道给awk,却能正确提取出第一个字段
OpenSSH
失败案例1
[root@centos ~]# ssh -V | awk -F_ '{print $1}' Output: OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022
失败案例2
[root@centos ~]# ssh -V | awk 'BEGIN{FS="_"} {print $1}' Output: OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022
正常案例(使用echo)
[root@centos ~]# echo "OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022" | awk -F_ '{print $1}' Output: OpenSSH
原因分析
核心问题是ssh -V的输出内容默认打印到标准错误流(stderr),而管道|仅会传递**标准输出流(stdout)**的内容。因此awk根本没有接收到ssh -V的输出数据,你看到的终端内容其实是ssh -V直接输出到stderr的原始信息,并非awk的处理结果。
解决方案
将ssh -V的stderr重定向到stdout,让管道能传递输出内容给awk:
ssh -V 2>&1 | awk -F_ '{print $1}'
执行后就能得到预期的OpenSSH结果。
内容的提问来源于stack exchange,提问作者isrikanthd
相关产品推荐
相关产品推荐

