CentOS下rev与cut管道执行无返回结果问题求助
排查
echo "a_b_c_d_e_f_g" | rev | cut -d_ -f2- 无输出的问题 首先,咱们先明确这个命令的预期行为:正常执行的话应该返回 f_e_d_c_b_a——rev 把原字符串反转成 g_f_e_d_c_b_a,然后 cut 以 _ 为分隔符,提取从第2个字段到末尾的内容。
你说命令始终无返回结果还怀疑有命令在等EOF,那咱们一步步排查:
1. 拆分命令,定位问题环节
先把管道拆开来单独测试,精准定位哪个步骤出了问题:
- 第一步测试echo:运行
echo "a_b_c_d_e_f_g",确认输出是a_b_c_d_e_f_g(带换行符)。 - 第二步测试rev:执行
echo "a_b_c_d_e_f_g" | /usr/bin/rev,正常应该输出g_f_e_d_c_b_a。如果这一步没输出,那问题肯定出在rev上——要么命令损坏,要么它没收到EOF。- 你可以直接运行
/usr/bin/rev,手动输入a_b_c_d_e_f_g后按Ctrl+D(手动发送EOF),如果还是没输出,说明rev命令本身有问题,CentOS里rev属于util-linux包,你可以尝试重新安装:yum reinstall util-linux。
- 你可以直接运行
- 第三步测试cut:如果rev输出正常,那把rev的结果传给cut试试:
echo "g_f_e_d_c_b_a" | /usr/bin/cut -d_ -f2-,正常应该输出f_e_d_c_b_a。如果这一步没输出,检查cut的参数是否正确,或者cut命令是否异常。
2. 排查缓冲或IO问题
GNU命令在管道中默认会用块缓冲,偶尔可能导致输出延迟(看起来像无输出)。你可以强制命令使用行缓冲试试:
echo "a_b_c_d_e_f_g" | stdbuf -oL /usr/bin/rev | stdbuf -oL /usr/bin/cut -d_ -f2-
stdbuf -oL 会让命令每次输出一行就刷新缓冲区,避免因为缓冲导致的无输出假象。
3. 检查输入内容是否有异常
有时候字符串里可能包含不可见字符(比如全角下划线、控制字符),导致cut无法正确识别分隔符。你可以用od命令查看实际输出的字符:
echo "a_b_c_d_e_f_g" | od -c
正常输出应该是类似这样的(全是半角字符和换行):
0000000 a _ b _ c _ d _ e _ f _ g \n 0000016
如果看到奇怪的字符,那就是输入内容的问题了。
4. 验证cut参数的兼容性
虽然-d_ -f2-是标准写法,但你可以试试更明确的写法,避免参数解析问题:
echo "a_b_c_d_e_f_g" | rev | cut -d '_' -f 2-
给分隔符加引号,参数之间加空格,看是否有变化。
内容的提问来源于stack exchange,提问作者rph
相关产品推荐
相关产品推荐

