bash変数は、文字列操作を使用して最初の文字を[]の文字に置き換えます。

bash変数は、文字列操作を使用して最初の文字を[]の文字に置き換えます。

私が持っているとしましょう:

variable=string

では、最初の文字の括弧を変更したい

${variable/firstletter/[firstletter]}

最後に、スクリプトでこれを使用して、正規表現パターンが独自に一致しないように修正したいと思います。

ps -e -o time,user,pid,ppid,comm,args | grep ${variable/firstletter/[firstletter]}

grep -v grep追加のパイプおよび/または代わりにこれを使用したいと思います。pgrep

また、awkコマンド自体を印刷するのではなく、awkを使用してgrepなどのプロセスを実装する方法を知っていますか?

答え1

引数の最初の文字を取得して括弧で囲んでから、残りを再度追加します。

bash-[508]$ variable=string
bash-[509]$ echo $variable
string
bash-[510]$ echo $variable to [${variable:0:1}]${variable:1}
string to [s]tring

したがって、コマンドは次のようになります。

ps -e -i time,user,pid,ppid,comm,args | grep "[${variable:0:1}]${variable:1}"

これは、変数の文字範囲に対してbashパラメータ置換を使用して開始する場所とインポート期間を提供します。

${variable:0:1}、文字0(文字列の先頭)から始めて1文字を取得します。したがって、最初の文字を分離するとv

${variable:1}、範囲を定義せずに文字1から始まり、$variableの終わりまですべてを取得しますariable

答え2

私の.bashrcにはこのような機能がありますが、複数の検索パターンを持つことができます。

psg () {
    local -a patterns=()
    (( $# == 0 )) && set -- $USER
    for arg in "$@"; do
        patterns+=("-e" "[${arg:0:1}]${arg:1}");
    done
    ps -ef | grep --color=auto "${patterns[@]}"
}

はい、存在することを知っていますpgrep

$ psg fish bash vim grep
glennj       2     1 67 09:00 ?        02:32:31 fish
glennj     153     1  0 09:00 tty2     00:00:06 fish
glennj    3122     1  0 11:08 tty3     00:00:07 fish
glennj    3964   153  0 12:14 tty2     00:00:00 vim supersecretfile
glennj    4992  3122  0 12:41 tty3     00:00:00 bash
glennj    5162  4992  0 12:45 tty3     00:00:00 grep --color=auto -e [f]ish -e [b]ash -e [v]im -e [g]rep

答え3

試してみてください:

#!/bin/sh 

variable=rsyslogd

regex="[$(expr "$variable" : '\(.\)')]""${variable#?}"
echo "$regex"
ps -e -o time,user,pid,ppid,comm,args | grep '$regex'

テスト:

$ ./script
[r]syslogd
00:00:00 root       521     1 rsyslogd        /usr/sbin/rsyslogd -n

変数の最初の文字が特殊な[[] *?の場合、ETCは失敗する可能性があります。

答え4

awkコマンド自体を印刷するのではなく、awkを使用してgrepなどのプロセスを実装する方法を知っていますか?

GNU awkを使用すると、スクリプトのPIDを取得してプロセス自体を除外できawkますPROCINFO

$ pattern=cron
$ ps -e -o time,user,pid,ppid,comm,args  |
  gawk -vpat="$pattern" 'NR == 1 || $3 != PROCINFO["pid"] && $0 ~ pat' 
    TIME USER       PID  PPID COMMAND         COMMAND
00:00:10 root       530     1 cron            /usr/sbin/cron -f

正規表現の一致ではなく、固定文字列の一致を実装するように$0 ~ pat変更されました。index($0, pat)

もちろん、pgrep以下を組み合わせて使用​​することもできますps

$ ps -o time,user,pid,ppid,comm,args $(pgrep "$pattern")
    TIME USER       PID  PPID COMMAND         COMMAND
00:00:10 root       530     1 cron            /usr/sbin/cron -f

関連情報