프로세스 '찾기' 출력은 특정 필드를 구문 분석합니다.

프로세스 '찾기' 출력은 특정 필드를 구문 분석합니다.

출력은 다음과 같습니다.

/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";

이 예에서는 "user" 및 "Password"("xxxxxxx";) 값을 새 파일로 리디렉션해야 합니다. "Users"는 항상 다섯 번째 디렉터리에 있지만 .rstd 확장자는 필요하지 않습니다. 내 새 파일 출력은 다음과 같아야합니다

user   "xxxxxxxx";

어떻게 하면 이 작업을 가장 잘 수행할 수 있습니까?

답변1

sed 사용

편의상 find 출력을 쉘 변수에 넣겠습니다 s.

$ s='/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'

이제 원하는 부분을 추출해 보겠습니다.

$ echo "$s" | sed -E 's|/([^/]*/){4}([^/.]*)[.][^"]*(.*)|\2 \3|'
user "xxxxxxx";

어떻게 작동하나요?

sed 스크립트는 단일 대체 명령으로 구성됩니다. 이 -E플래그는 확장 정규식을 활성화합니다.

  • 이 줄은 다음과 같습니다./([^/]*/){4}([^/.]*)[.][^"]*(.*)

    /([^/]*/){4}처음 4개의 디렉터리와 일치합니다. 이들 디렉토리 중 마지막 디렉토리는 괄호로 인해 그룹 1로 저장되지만 우리는 이를 사용하지 않을 것입니다.

    ([^/.]*)확장자가 없는 사용자 이름과 일치합니다. 괄호가 있기 때문에 그룹은 그룹 2로 저장됩니다.

    [.][^"]*확장명과 첫 번째 큰따옴표 앞의 모든 항목과 일치합니다.

    (.*)첫 번째 큰따옴표부터 줄 끝까지의 모든 항목과 일치합니다. 이번에도 대괄호 때문에 그룹 3으로 저장됩니다.

  • 대체 텍스트 \2 \3는 그룹 2, 공백, 그룹 3을 나타냅니다.

awk를 사용하세요

$ echo "$s" | awk -v FS="/" '{ name=$6; sub(/[.].*/,"", name); sub(/[^"]*/, ""); print name, $0;}'
user "xxxxxxx";

어떻게 작동하나요?

  • -v FS="/"

    그러면 필드 구분 기호가 로 설정됩니다 /.

  • name=$6; sub(/[.].*/,"", name)

    awk는 필드 수를 계산하므로 이름은 여섯 번째 필드에 있습니다. 여섯 번째 필드를 변수에 저장 name하고 name첫 번째 기간 이후의 모든 항목을 삭제합니다.

  • sub(/[^"]*/, "")

    이렇게 하면 첫 번째 줄을 제외한 줄의 모든 항목이 삭제됩니다 ".

  • print name, $0

    그러면 이름, 필드 구분 기호(기본적으로 공백) 및 교체 후 줄에 남은 내용(비밀번호)이 인쇄됩니다.

답변2

그룹화를 사용하여 이 작업을 수행 할 수 있습니다 sed.

$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";' | \
sed 's,\(^/var.*stores/\)\(user\)\(.rstd.*= \)\(.*\),\2  \4,'
user  "xxxxxxx";

이상해 보인다는 걸 알아요 ;) 아니면 더 간단한 방법을 사용할 수도 있습니다

sed -e 's,/var/data/run/stores/,,;s,\..*=,,'

답변3

매우 길지만... 작동하는 것 같습니다.

$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'  | \
awk -F/ ' { print $6 $7} ' | awk -F"." ' { print $1, " ", $3 } ' | \
awk ' { print $1 " " $NF } '
user "xxxxxxx";

답변4

사용진주

~$ perl -pe 's{^(\/[^/]+){4}\/(\w+)\.rstd\/[^/ ]+\hPassword\h\=\h\"(.+)\"}{$2 $3};'   file

#OR (with \x option)

~$ perl -pe 's{ ^ ( \/ [^/]+ ){4} \/ (\w+) \. rstd \/  [^/ ]+ \h Password \h \= \h \" (.+) \" }{$2 $3}x;'  file

사용행복하다(이전 Perl_6)

~$ raku -pe 's{ ^ [ \/ <-[ / ]>+ ]**4 \/ (\w+) \. rstd \/  <-[ / \h ]>+ \h Password \h \= \h \" (.+) \" } = "$0 $1";'  file

#OR (much more explicitly)

~$ raku -pe 's{ ^ [ \c[SOLIDUS] <-[ \c[SOLIDUS] ]>+ ]**4 \c[SOLIDUS] (\w+) \.rstd \c[SOLIDUS]  <-[ \c[SOLIDUS] \c[SPACE] ]>+ \c[SPACE] Password \c[SPACE] \= \c[SPACE] \c[QUOTATION MARK] (.+) \c[QUOTATION MARK] } = "$0 $1";'  file

입력 예:

/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx"; 

출력 예(모두 4개 예):

user xxxxxxx; 

펄 참조:
https://perldoc.perl.org/perlrequick
https://perldoc.perl.org/perlre

Leku 참고 자료:
https://docs.raku.org/언어/regexes
https://docs.raku.org/언어/regexes-best-practices

관련 정보