inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

리눅스 쉘 스크립트 마스터

명령어(sed)

sed 관련 질문

645

김용권

작성한 질문수 1

1

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

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

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

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

linux shell-script

답변 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

김용권

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

강의 잘보고 있습니다.

0

홍영기

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

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

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

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

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

 

 

 

 

0

김용권

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

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

 

[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

 

59회차 학습 미작동

0

74

2

BASH_REMATCH 변수가 어디서 나온거죠?

1

923

1

${object%%:*}, ${object#*:}는 어떤 뜻인가요

2

404

1

./euid.sh

2

405

1

touch 'Gone with the wind.mp3' 입력 결과가 다릅니다

1

370

1

스크립트에서 %는 무엇을 의미하나요?

1

525

1

하드 링크, 심볼릭 링크

1

697

2

[..]와 테스트 강의에서

1

395

1

하드 링크, 심볼릭 링크

0

637

1

변수명이 출력되지 않습니다.

1

294

1

변수명 출력이 되지 않습니다.

0

348

1

select in case문 질문

0

237

1

crontab 질문이 있습니다.

1

229

2

(..)_(..) 와 BASH_REMATCH

1

752

1

^[.+] 정규표현식이 RegExr 를 나타내는게 맞나요?

1

397

2

실습자료를 다운받은 다음에 어떻게 해야 하나요?

0

449

3

sudo cp helloworld.sh /usr/bin 명령어 질문

1

610

1

read -p 명령어가 동작하지 않습니다.

2

356

1

wc 명령어에 -L 옵션이 동작하지 않습니다.

1

443

1

book이 변수가 아니라 파일인가요?

1

363

1

파일접근권한 강의

1

147

1

[] 결과

2

215

1

# (주석) 관련 질문 드립니다.

1

168

1

bash 타이핑 정보 읽어들이기

1

212

1