이번 시간에는 sed 명령어를 이용해서 :로 구분되어 있는 PATH 변수를 보기 쉽게 출력하는 방법을 익혀 보겠습니다. 그리고 응용 문제도 간단하게 풀어봅시다.

 


 먼저 env는 (환경) 변수들의 목록을 보여줍니다. 대표적으로 PATH와 같은 것들이 있습니다. 아마 자바를 설치하셨다면, 한 번 정도는 써 보셨지 않을까 싶습니다. echo $JAVA_HOME을 쓰실려나요?

 

 env | grep PATH를 입력하면, env의 결과에서 PATH를 부분 문자열로 가지는 행을 가져 오는데요. 뭔가 경로가 여러 개가 있는 거 같습니다. /usr/local/sbin:/usr/local/bin:... 이렇게 있는 걸로 보아서는, :을 구분자로 해서, 경로들이 구분 되는 것으로 보였습니다. 이 변수가 긴 경우에는 읽기가 그리 편하지는 않을 겁니다.

 

 

 윈도우의 환경 변수 설정 탭에 들어가 보면 ;을 구분자로 Path에 들어간 경로들이 구분된 문자열이 보이는데요. 되게 길어요. 이 변수를 수정하기 버튼을 누르면 아래와 같이 뜹니다.

 

 

 아까보다는 알아보기 쉽게 변환 되었음을 알 수 있어요. 제 목표는, PATH에 있는 경로들을 path 하나당 한 줄에 출력하게끔 바꾸는 것입니다. 단, 제 시스템에 있는 폴더 이름은 모두 대소문자이거나 숫자로만 이루어져 있습니다.

 


 먼저 =을 기준으로 2번째 부분을 불러와야 하니, awk 명령어를 쓰겠습니다. 구분자를 따로 셋팅하는 것은 -F 옵션을 주면 되는데요. 

 

 잘 읽어보니까 value 부분을 "="으로 주면 되겠네요?

 

 즉 위와 같이 입력하시면, PATH의 값만 불러오게 됩니다. 그런데 이 상태로는 읽기가 여간 불편한 게 아닙니다. 경로1:경로2:경로3 이렇게 되어 있는 것을 1번째 줄에는 경로1, 2번째 줄에는 경로2, 3번째 줄에는 경로3 이렇게 바꾸면 조금 더 보기 편하지 않을까요? 즉, :가 나온다면 이것을 \n으로 바꾸는 replaceAll의 기능을 수행해야 함을 알 수 있어요.

 

 

 replacement에 대한 것을 찾아보니, 이 부분이 눈에 들어옵니다. regexp로 매칭되는 부분을 replacement로 바꾸게 됩니다. 즉, sed 's/:/\n' 이렇게 입력하게 되면, :을 \n으로 바꾸게 됩니다.

 

 

 정말 그렇게 되었는지 확인해 보니, 1번째 :은 개행으로 잘 치환이 되었습니다. 그런데 나머지 :는 개행으로 치환이 되지 않았습니다. 이는 g flag를 붙이지 않으면, 1번째로 매치되는 :만 replace 하기 때문입니다. 이 부분은 문서에 잘 나와 있습니다.

 

 

 뒤에 g flag를 붙이면, : 패턴을 모두 \n으로 바꾸게 됩니다. 그렇게 하면 PATH에 있는 모든 path들을 :가 아닌 개행을 구분으로 출력해 주니, 보다 더 쉽게 볼 수 있습니다.

 

 


 조금 더 어려운 문제를 풀어봅시다. 계정 이름이나 캐릭터 이름은 대소문자와 숫자만 된다고 하겠습니다.

 

 cho_maple에는 제 계정 정보가 담겨 있어요. 각 줄마다 넥슨 아이디=캐릭터 정보들로 구성되어 있고요. 캐릭터 정보는 캐릭터 이름=레벨 형식으로 이루어져 있어요. 이들은 :로 구분되어 주어지고요. 예를 들어 위에 있는 cho_maple 파일에는 넥슨 아이디가 maple이고, cho라는 캐릭터는 200, ga라는 캐릭터는 200, hui라는 캐릭터는 135라는 의미입니다. 이렇게만 있으면 뭔가 불편하죠? 예를 들어 200이 넘는 캐릭터만 filtering을 한다던지.

 

 그래서 목적은 뭐냐면, 이 문자열을 1번째 줄에는 cho=200을, 2번째 줄에는 ga=200을, 3번째 줄에는 hui=135로 떨구는 게 목적이에요. 어떻게 해야 할까요? 일단 =을 구분자로 해서 2번째부터 얻어오면 될 듯 하기는 한데, 저는 다른 방법을 쓰겠습니다. 먼저, 맨 앞에 있는 =을 다른 문자로 치환하겠습니다.

 

 

 sed 's/=/|/' 이렇게 입력해 주면, 첫 번째로 match가 되는 =만 |으로 바꾸겠다는 의미입니다. 그러면 |을 기준으로 넥슨 계정정보와 캐릭터 정보들이 구분됩니다. 따라서, 그 다음에는 awk로 | 이후의 것만 얻어오면 됩니다. 2번째 혹은 3번째를 |로 바꾸는 방법은 man 페이지를 잘 읽어보시면 어렵지 않게 찾을 수 있을 것이니, 여기에서는 따로 언급하지 않겠습니다.

 

 

 다음에, 모든 :을 \n으로 replaceAll하면 되겠죠?

 

 

 잘 나오네요. 이제 저것을 토대로 레벨별로 정렬하거나 하는 것은 다음에 다시 해 보도록 합시다.