如何在命令行上顺序执行多个命令?

如何在命令行上顺序执行多个命令?

我将多个命令粘贴到命令行中,并希望每行都按顺序执行并输出结果。

我粘贴我的输入:

cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l   

并获得输出:

  469005
    9999
    5099
      25

但相反,希望每个命令在每个换行符之后执行并让我的输出看起来像:

cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l
469005
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l
9999
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
5099                                                                       

不确定这是否可行,但如果我不必将每个结果映射回它来自的行,它会节省我很多时间

答案1

如果您将命令复制粘贴到终端模拟器,那么这件事就不太简单了。这里的问题是终端(处理文本输入和显示)是与 shell(打印提示符并处理命令行)不同的进程,并且终端无法真正知道您正在输入的文本的含义。粘贴。因此它不能等待上一个命令完成,也不能等待 shell 再次提示。

您可以做的是使用set -vset -x让 shell 在运行命令时打印命令,或者在这种特殊情况下,编写一个简短的 shell 循环来运行 s grep

for pattern in 'type_of_record_new creating' \
    'type_of_record_modification found 1' \
    'type_of_record_modification found 0' \
    'type_of_record_inactivation found 1'
do
    printf "%s:\n%10d" "$pattern"
    grep -c -e "$pattern" type_of_record.txt
done

这会给出这样的输出

type_of_record_new creating: 469005
type_of_record_modification found 1: 9999

当然,确切的格式可以修改。如果您希望数字位于单独的行上并右对齐,您可以使用命令替换和printf %d行数:

for pattern in ...
do
    printf "%s:\n%8d\n" "$pattern" "$(grep -c -e "$pattern" type_of_record.txt)" 
done

答案2

只需将剪贴板粘贴到定界文档中即可:

$ sh -v << EOF
> cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
> cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
> cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
> cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
> EOF
cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
cat: type_of_record.txt: No such file or directory
       0

在上面,我输入了“sh -v << EOF”,然后将问题中的代码粘贴到终端中,然后按回车键并输入“EOF”。如果你做这种事,请确保你小心检查您正在粘贴的文本。您可能需要引用分隔符(例如sh << 'EOF')以避免对任何粘贴的文本进行插值,但在本例中没有必要。

但请注意,在这种特殊情况下,最好使用 awk 来计算匹配记录,这样您只需遍历文件一次。

答案3

使用echo可能会做到这一点

首先,您将使用单引号将命令逐字回显为字符串,然后

其次,您将使用双引号回显该命令,这将执行该命令

echo '$(date)'; echo "$(date)"

这使

robert@pip2:/tmp$ echo '$(date)'; echo "$(date)"
$(date)
Fri May 18 07:30:27 PDT 2018

相关内容