単語の特定の文字列を読み取るときにコマンドを実行します(たとえば、新しい行の開始)。

単語の特定の文字列を読み取るときにコマンドを実行します(たとえば、新しい行の開始)。

スクリプトがテキストファイルを読み取るときに特定の変数で特定の文字列が見つかった場合は、このコードに特定のコマンドを実行させたいと思います。

例:

次のコードを使用してコマンドの出力を読みたいとしますlast

#!/bin/bash
for i in `last`; do 
  sleep 0.1 | echo -ne "$i " 
done

このコマンドの出力は、last次のような項目リスト形式の表です。

username  pts/2        1.2.3.4 via  Sun Sep  2 06:40 - 06:40  (00:00)
. . . . 
. . . . 
  1. i上記のコードの変数は、上記の表のどのフレーズでも構いません。次のような特定のコマンドを適用したいと思います。新しい行を始めるi変数にi閉じ括弧が含まれている場合など、変数で特定の文字列を見つけるときに)コードが新しい行を開始するようにしたいと思います。

  2. コードがコマンド出力を読み終えたら、lastコードを繰り返したいと思います。~のため新しいアップデートがあるかどうかを読むには、もう一度(複数回)繰り返します。コードを再実行するように指示するにはどうすればよいですか?たとえば、gotoコードを特定の行に移動させるコマンドがありますか?

アドバイスをお願いしますか?

答え1

出力がlast次の場合:

username  pts/2        1.2.3.4 via  Sun Sep  2 06:40 - 06:40  (00:00)

元の場所に改行文字を追加する場合は、ロジックを少し変更することをお勧めします。まず、入力を1行ずつ読み、次に行を単語に分割します。これにより、明示的に括弧を見つける必要がなくなります。でラップして、サイクル全体を繰り返すことができますwhile true; do ... done。だから私たちは次のようなものを持っています:

#!/bin/bash
set -f
while true; do
        last | while IFS= read -r line; do
                for word in $line; do
                        sleep .1
                        printf "%s " "$word"
                done
                echo     # prints a newline
        done
done

set -f引用符のない拡張機能によって引き起こされる可能性のあるファイル名拡張を無効にします$line。また、printfさまざまな理由で単語を印刷するためにechoの代わりにechoを使用します。

閉じ括弧を本当に探したい場合は、この[[ .. ]]テストを使用できます。このテストでは、glob 様パターンや正規表現のパターンマッチングを可能にします。 ([[ $word =~ $re ]]正規表現一致になります)

#!/bin/bash
set -f
while true; do
        for word in $(last); do
                sleep .1
                printf "%s " "$word"
                [[ $word = *')'* ]] && echo
        done
done

もちろん、この行は、最終ログイン期間が次のように置き換えられる行に改行文字を追加しませんstill logged in

このfor word in $whatever構造の欠点は、複数のスペースを単一のスペースのように扱うため、スクリプト出力の列が元のようにきれいに整列されないことです。

答え2

if .. then次のようなステートメントを使用できます。

#!/bin/bash
for i in `last`; do 
    sleep 0.1 | echo -ne "$i " 
     if [[ $i = *')'* ]] ; then 
       echo "" ; 
     fi
done

for loopbashからコマンド(例ではコマンド)の出力を繰り返し読み取るには、lastスクリプトをスケジュールする必要がありますcrontabここ

答え3

取ることができるアプローチはさまざまであり、要件を説明する必要があります(特定の人のログインの識別、特定の時間にログインした人の識別など)。

あなたが言ったように(最後に何かが表示されたら改行を追加します)、すでに他の方法があります。

#finding if a 'last' line contains a "specific_thing" (which is itself a regular expression...) 
# and can print all lines or not depending on showall value
while true ; do
  last | awk -v looking_for="specific_thing" -v showall=0 '
    ( showall == 1 )     { print $0 }
    ( $0 ~ looking_for ) { action="print line? and add something to it?" }
  '
done

#watch for new things appearing in last and not the whole "last" output every time
watch last | awk -v looking_for="specific_thing" -v showall=0 '
    ( showall == 1 )     { print $0 }
    ( $0 ~ looking_for ) { action="print the line? with added infos?"
                           action="execute : system(some command) ?"
                           action="all of that?" }
  '

など。

ログファイルでゴーストを見つけることもできます。

/etc/profileにいくつかのコマンドを挿入することもできます。 (これは多くのセキュリティリスクを引き起こす可能性があり、起動、初期起動などで問題を引き起こす可能性があります。これは、いくつかのログイン問題を引き起こす可能性がある醜いハッキングです。すばやく押すとバイパスできます...)

など。行く方法はいくつかあります。最善のことは何をすべきかを修正することです。今「最後」に固執し、「何かが見えたら改行を追加してください」

より良い回答を得るには、どうすればよいと思うのか、実際に必要なものと、なぜ必要なのかを教えてください。 (最後の出力を見るときに改行を追加します。なぜ必要だと思いますか?これの基本的な必要性は何ですか?)

関連情報