본문 바로가기
Linux & UNIX

배시에서 if문에 정규식과 캡처링그룹 사용하기

by fabxoe 2021. 6. 9.
#!/bin/sh
project="29206|||95.2|||/home/aio........../1/20210608182432|||0
29207|||96.2|||/home/aio.........../2/20210608182432|||1
[0] GeForce GTX 1080 Ti | 68'C,   0 % | 10917 / 11175 MB | python/29206(10907M)
[1] GeForce GTX 1080 Ti | 100'C,   4 % |     0 / 11178 MB | python/29207(10002M)
[2] GeForce GTX 1080 Ti | 66'C,   4 % |     0 / 11178 MB |"


#while [[ ${project} ]]
#do

#done

if [[ ${project} =~ ([[:digit:]]{1,})\|{3}([[:digit:]]{1,3}\.?[[:digit:]]{0,3})\|{3}.+?(\/train\/.+?)\|{3}([[:digit:]]) ]]; then
        pid1+=${BASH_REMATCH[1]}
        cpu_usage+=${BASH_REMATCH[2]}
        commands+=${BASH_REMATCH[3]}
        index1+=${BASH_REMATCH[4]}
        echo !! ${BASH_REMATCH[*]} !!
        echo @@ ${BASH_REMATCH[$profile]} @@
fi

if [[ ${project} =~ \[([[:digit:]]+?)\].+?\|[[:space:]][[:digit:]]{1,3}\'C\,[[:space:]]+?([[:digit:]]{0,3})[[:space:]]\%[[:space:]]\|[[:space:]]+?([[:digit:]]+?)[[:space:]]\/[[:space:]]+?([[:digit:]]+?)[[:space:]][[:alpha:]]B[[:space:]]\|[[:space:]][[:alpha:]]+?\/([[:digit:]]+?)\(?[[:digit:]]+?M\) ]]; then

      index2=${BASH_REMATCH[1]}
      ea_proc_gpu_usage=${BASH_REMATCH[2]}
      gpu_mem_used=${BASH_REMATCH[3]}
      gpu_mem_total=${BASH_REMATCH[4]}
      pid2=${BASH_REMATCH[5]}
      echo $pid1,$pid2,$index1,$index2,$cpu_usage,$ea_proc_gpu_usage,$gpu_mem_used,$gpu_mem_total,$commands
fi

 

 

!! 29206|||95.2|||/home/aio......../1/20210608182432|||0 29207|||96.2|||/home/aio........./2/20210608182432|||1 29206 95.2 /tr......./2/20210608182432 1 !!
@@ 29206|||95.2|||/home/aio........./1/20210608182432|||0 29207|||96.2|||/home/aio......../2/20210608182432|||1 @@
29206,29207,1,0,95.2,4,0,11178,/train/3/............/2/20210608182432

 

결과를 확인해볼 것

${BASH_REMATCH[1]}   캡쳐링 그룹

${BASH_REMATCH[$regex]}     패턴매칭에 사용된 원문이 어디까지 보여줌

${BASH_REMATCH[*]}   패턴매칭에 사용된 원문이 어디까지인지, 그리고 패턴으로부터 파싱한 결과까지 같이 보여주는 아주 중요한 변수임

 


https://fabianlee.org/2020/01/29/bash-using-bash_rematch-to-pull-capture-groups-from-a-regex/

 

Bash: Using BASH_REMATCH to pull capture groups from a regex – Fabian Lee : Software Architect

The =~ binary operator provides the ability to compare a string to a POSIX extended regular expression in the shell. Take note, the right-hand side regex cannot be surrounded by quotes or it will be treated as a regular string, it cannot contain spaces, an

fabianlee.org

 

주의해야할 점들

 

조건문의 대괄호 사이에 양쪽 칸을 한칸씩 띄우기

조건문에 정규식패턴 작성시 더블쿼테이션 감싸지 말기

https://118k.tistory.com/737

 

[bash] 쉘스크립트에서 정규식을 이용하여 숫자포함여부 확인하기

배쉬에서 정규식 연산자는 =~ 를 이용합니다. 정규식을 이용할 때는 변수에 넣어서 처리하는 방법과 바로 이용하는 방법이 있습니다. #!/bin/bash // 변수를 이용하는 방법 re="^[0-9]+$" if [[ $1 =~ $re ]];

118k.tistory.com

 

'Linux & UNIX' 카테고리의 다른 글

리눅스 쉘스크립트의 대괄호[ ]는 test 문법  (0) 2021.06.11
awk 사용법  (0) 2021.06.10
쉘 작성 끝판왕!  (0) 2021.06.09
리눅스에서 .service 파일 생성시 주의 할 것  (0) 2021.06.04
프롬프트명 일시변경  (0) 2021.06.02

댓글