• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

sed 관련 질문

21.09.29 15:19 작성 조회수 377

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

 

 

김용권님의 프로필

김용권

질문자

2021.10.05

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

강의 잘보고 있습니다.

0

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

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

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

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

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

 

 

 

 

김용권님의 프로필

김용권

질문자

2021.10.01

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

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

 

[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