コマンドラインで複数のコマンドを順次実行するには?

コマンドラインで複数のコマンドを順次実行するには?

複数のコマンドをコマンドラインに貼り付け、各行を順番に実行して結果を出力したいと思います。

入力内容を貼り付けます。

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

コマンドをコピーして端末エミュレータに貼り付けるのは簡単ではありません。ここでの問題は、端末(テキスト入力と表示を処理する)がシェル(プロンプトを印刷してコマンドラインを処理する)とは異なるプロセスであり、端末は実際にユーザーが入力したテキストが何であるかを知ることができないことです。スーダン。生地。したがって、前のコマンドが完了するのを待つか、シェルが再びプロンプトを表示するのを待つことはできません。

あなたができることは、シェルが実行されたときにコマンドを印刷するか、この特別な場合にsを実行するショートシェルループを書くことset -vです。set -xgrep

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」と入力し、質問のコードを端末に貼り付け、Enterキーを押して「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

関連情報