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

관련 정보