출력은 다음과 같습니다.
/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