【问题标题】:Bash shell script update and print a variable overwriting the same line [duplicate]Bash shell脚本更新并打印覆盖同一行的变量[重复]
【发布时间】:2016-02-25 04:32:55
【问题描述】:

我一直在尝试同时为一个假装自动化过程的脚本打印一个变量,内容是这个的输出

sed "s/Read/\n/g" /tmp/Air/test.txt | tail -1 test.txt | grep ARP

所以我把它放在一个while循环中

    do
       out= sed "s/Read/\n/g" /tmp/Air/test.txt | tail -1 test.txt | grep ARP
       echo  -n  "$out"
       sleep 1
    done

我在这里阅读了其他问题,我尝试使用不同的选项,例如 echo -neecho -ne "$out" \rprintf "\r"printf "%s",但没有人运气好,所有其他示例都没有要打印的变量计数器o系统变量

更新

似乎echo -n 在同一行重复$out,如果out="this is a test" 的输出echo -n 是“这是一个测试这是一个测试这是一个测试这是一个测试。 ...”也许我错过了一些选择?

更新 2

对不起,我可能不是很清楚,但我想要的是用 $out 的值覆盖同一行,$out 的源是与脚本一起执行的 aireplay-ng 命令的输出我用

得到输出

输出是这样的

102415 packets (got 5 ARP requests and 15438 ACKs), sent 37085 packets...(499 pps)

但是ARP请求的数量是不断变化的

此代码例如使用 echo -ne 并在同一行覆盖

    #!/bin/bash
    for pc in $(seq 1 100); do
       echo -ne "$pc%\033[0K\r"
       sleep 1
    done

这个输出就像一个百分比指示器,显示“10%”而不是“1% 2% 3% 4% 5% ..”在同一行,我已经尝试过这样但没有运气

【问题讨论】:

  • 没有正确回答您的问题,但我假设您可以尝试执行out=$(sed ...) 或只是执行echo $(sed ...),您也可以删除echo,因为grep 无论如何都会打印它跨度>
  • 您能否发布您的整个脚本和输入文件,以便我们找出确切的问题?
  • 是一个简单的函数,基本上就是整个代码,输出来自 aireplay-ng 命令,类似于 102415 个数据包(收到 5 个 ARP 请求和 15438 个 ACK​​),发送了 37085 个数据包。 ..(499 pps)我用普通文本文件和相同的命令运行了一些测试,似乎 echo -n 选项正在工作,但如果文本文件的内容是“这是一个测试” echo -n 显示“这是一个测试这是一个测试这是一个测试......”
  • 嗯? “这是一个测试这是一个测试这是一个测试”正是如果你做对了(在一个循环中)它会期望打印的内容:它一遍又一遍地打印相同的内容中间没有换行符。这不是你要的吗?
  • 顺便说一句,如果您的字符串中可能存在其他控制字符,请考虑使用%q 而不是%s 以人类可读、明确的形式打印它们,而不是像它们一样将它们发送到终端是并让终端解释它们。

标签: linux bash shell output


【解决方案1】:

如果你正在尝试执行 sed 请使用

`sed "s/Read/\n/g" /tmp/Air/test.txt | tail -1 test.txt | grep ARP`

【讨论】:

  • 感谢指正,我改了还是有同样的问题
【解决方案2】:

首先,您错误地将 bash 命令的值分配给变量。

out=$(sed "s/Read/\n/g" /tmp/Air/test.txt | tail -1 test.txt | grep ARP)

然后你可以在一行中打印你写的所有输出:-

echo -n $out

【讨论】:

  • 作业中的= 后面不能有空格。
  • 是的!感谢您的更正....已编辑
  • dint 工作,我按照你说的尝试,但没有运气,总是在每个循环的新行中打印 $out,而不是在同一行中再次打印
  • aside: echo -n 不被 POSIX 保证会留下一个尾随换行符(或做任何其他特定的事情;echo 的 POSIX 规范只是让它未定义)。 printf '%s' "$out" 更健壮。
  • 我已经准备好尝试使用 printf '%s' "$out" 但我没有运气,也许我不是很清楚,但我想覆盖同一行而不是继续添加 $out值在同一行,非常感谢您的帮助
【解决方案3】:

您问题的最新附录读起来就像您误解了您的意图:this is a test this is a test this is a test 是您的问题的简单阅读表明您要求(一遍又一遍地打印this is a test毕竟,在没有换行符的循环中,可以期望什么都不做);为什么你会在一个听起来像一个错误的上下文中描述它,这令人惊讶。


如果您想将光标返回到当前行的开头并覆盖该行,可能类似于以下内容:

#!/bin/bash
#      ^^^^ not /bin/sh; this enables bash extensions

# ask the shell to keep $COLUMNS up-to-date
shopt -s checkwinsize

# defaults to 80-character terminal width, but uses $COLUMNS if available
printf "%-${COLUMNS:-80}s\r" "$out"`

...打印你的字符串,用空格填充到 80 个字符,然后将光标返回到行首,这样你接下来写的东西就会覆盖那个字符串。

当然,如果您打印该行然后返回到 shell 提示符,则提示符将从同一行的开头开始并覆盖文本,因此请务必跟进 echo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 2021-08-22
    • 2021-03-15
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多