작성
·
565
1
sed롤 통해 ip와 디스플레이 변수를 추출하는 구문을 만들어 봤는데 되긴 되는데 정확히 이해가 가지 않습니다.
who -am|sed 's/.\+(\(.\+\))$/\1/'|cut -d '.' -f 1,2,3,4
's/.\+(\(.\+\))$/\1' 이 부분을 어떻게 수정하닥 되긴 됐는데 정확히 이해가 가지 않습니다.
풀어서 설명 해주실 수 있나요??
답변 2
0
김용권님! 안녕하세요~~
아래 두가지 표현은 실행시 결과적으로는 큰 차이가 없습니다.
cut 명령어는 delimiter dot(.) 을 사용함으로써 파이프로 넘겨받은 문자열이 아이피 어드레스인지를 검사하고 있네요. 이 글의 맨 마지막 부분을 보시면 더 효과적인 방법을 보실 수 있어요.
이 예문은 sed 명령어 활용 부분이 핵심입니다.
아래와 같이 정리해드립니다.
보시기 좋게 각 명칭을 색상으로 구분하여 달아놓았습니다.
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
이해가 됐습니다. 답변 정말 감사드립니다.
강의 잘보고 있습니다.