인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김용권님의 프로필 이미지
김용권

작성한 질문수

리눅스 쉘 스크립트 마스터

명령어(sed)

sed 관련 질문

작성

·

565

1

sed롤 통해 ip와 디스플레이 변수를 추출하는 구문을 만들어 봤는데 되긴 되는데 정확히 이해가 가지 않습니다.

who -am|sed 's/.\+(\(.\+\))$/\1/'|cut -d '.' -f 1,2,3,4

's/.\+(\(.\+\))$/\1' 이 부분을 어떻게 수정하닥 되긴 됐는데 정확히 이해가 가지 않습니다.

풀어서 설명 해주실 수 있나요?? 

답변 2

0

홍영기님의 프로필 이미지
홍영기
지식공유자

김용권님! 안녕하세요~~

아래 두가지 표현은 실행시 결과적으로는 큰 차이가 없습니다.

cut 명령어는 delimiter dot(.) 을 사용함으로써 파이프로 넘겨받은 문자열이 아이피 어드레스인지를 검사하고 있네요. 이 글의 맨 마지막 부분을 보시면 더 효과적인 방법을 보실 수 있어요.

who -am|sed 's/.\+(\(.\+\))$/\1/'|cut -d '.' -f 1,2,3,4

who -am|sed 's/.\+(\(.\+\))$/\1/'

 

이 예문은 sed 명령어 활용 부분이 핵심입니다.

아래와 같이 정리해드립니다.

 

sed 명령어는 기본적으로 BRE(Basic Regex Expression) 을 지원합니다.

표현식에서 메타 문자 (){}+?| 는 이스케이프(ESCAPE) 가 필요합니다

보시기 좋게 각 명칭을 색상으로 구분하여 달아놓았습니다.

sed 's/.\+(\(.\+\))$/\1/'          # 그룹설정

 

sed 's/.\+(\(.\+\))$/\1/'          # 첫번째 매칭 그룹

 

sed 's/.\+(\(.\+\))$/\1/'          # 문자열의 마지막을 나타내는 메타문자

 

sed 's/.\+(\(.\+\))$/\1/'          # (192.168.0.93)

 

sed 's/.\+(\(.\+\))$/\1/'          # ANY 문자의 반복

 

 

sed 명령어에 옵션( -r ) 을 사용하면 확장 정규 표현식(ERE)을 사용하실 수 있습니다.

 

이 경우는 BRE 에서와 달리 표현식에서 메타 문자 (){}+?| 는 이스케이프(ESCAPE) 하지 않습니다.

sed -r 's/.+\((.+)\)$/\1/'.        # 그룹설정

 

sed -r 's/.+\((.+)\)$/\1/'.        # 첫번째 매칭 그룹

 

sed -r 's/.+\((.+)\)$/\1/'.        # 문자열의 마지막을 나타내는 메타문자

 

sed -r 's/.+\((.+)\)$/\1/'.        (192.168.0.93) 

 

sed -r 's/.+\((.+)\)$/\1/'.        # ANY 문자의 반복 

 

보시는 바와 같이 sed 명령어에 옵션( -r ) 을 함께 적으면 이스케이프 문자가 적게 사용됨으로써 ERE 방식이 BRE 방식에 비해 가독성이 조금 더 좋아집니다.

 

마지막으로 다른 표현 한 가지를 보여드리면서 글을 마무리 하겠습니다.

sed -r 's/.+\(([[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3})\)$/\1/'

이 예문의 경우 아이피 어드레스를 정규식으로 검증할 수 있다는 장점이 있습니다.

 

행복한 하루되세요~~. 감사합니다:D

 

 

김용권님의 프로필 이미지
김용권
질문자

이해가 됐습니다. 답변 정말 감사드립니다.

강의 잘보고 있습니다.

0

홍영기님의 프로필 이미지
홍영기
지식공유자

김용권님!  반갑습니다^^

sed 명령어를 이용한 문자열 서브스트링에 관련된 질문을 하셨네요.

(1)who -am 명령 실행 후 화면에 출력된 결과와

(2)who -am|sed 's/.\+(\(.\+\))$/\1/'|cut -d '.' -f 1,2,3,4 명령 실행 후 화면에 출력된 결과 를 각각 좀 보여주실 수 있으실까요?

그럼 좀 더 효과적인 답변을 드릴 수 있을 것 같아서요:)

 

 

 

 

김용권님의 프로필 이미지
김용권
질문자

빠른 답변 주셔서 감사합니다.

아래와 같이 출력이 됩니다.

 

[root@kb shell_cmd]# who -am

           pts/1        2021-08-05 15:46                 0 id=/1    term=0 exit=0

root     + pts/1        2021-10-01 09:44   .         63600 (192.168.0.93)

 

[root@kb shell_cmd]# who -am|sed 's/.\+(\(.\+\))$/\1/'|cut -d '.' -f 1,2,3,4

192.168.0.93

 

김용권님의 프로필 이미지
김용권

작성한 질문수

질문하기