패턴이 일치하는 내용을 빠르게 찾으려고 할 때, grep 명령어는 자주 쓰는 편입니다. 패턴이라 하면, regex가 들어갈 거 같은데.. 네. 사실 그것을 조금이라도 알면 꿀은 먹을 수 있다는 장점이 있습니다. 작업 속도가 중요한 환경에서는. 눈치 안 보이게 하려면 익혀두는 수밖에 없는 듯 싶어요.

 

 file에서 패턴과 일치하는 부분이 있는 행을 결과값으로 내보냅니다. 그런데, 사실 이런 패턴을 생각보다 많이 씁니다.

 

 명령어 1의 결과를 input으로 받아서, grep option pattern을 수행합니다. 예를 들어, ls -ail이 명령어 1이였다면, ls -ail의 결과에, pattern과 일치하는 행을 리턴합니다. 생각보다, 이는 매우 강력한 도구가 될 수 있습니다. 예를 들자면, 프로세스들 중에서, 어떤 것이 Zombie 상태인지 알아내거나, 아니면, 현재 리눅스 소켓 중에서 상태가 LISTEN인 것들만 따로 검색하거나. 그러면, 이러한 도구들을 어떻게 이용할 수 있는지, 예제를 보면서 알아보도록 하겠습니다.

 

 


 먼저 ps는 현재 프로세스의 상태들을 출력해주는 명령어입니다. 여기서, grep 1을 해 보도록 하겠습니다.

 

 출력 결과를 보시면 1이 나온 행들은 모두 출력했음을 알 수 있습니다. 즉, 어떠한 행의 결과 string이 "1"을 부분 문자열로 가진다면 그것들을 모두 출력했음을 알 수 있습니다.

 

 

 저는, 이렇게 많은 결과들 말고, PID가 1인 것에 대한 정보만 얻어오고 싶습니다. 그러면 어떻게 하면 될까요?

 

 

 패턴만 바꿔주면 됩니다. ' 1 '로요. 공백, 1, 공백 이렇게 오게끔 하면, 12488이나, 31 등은, 패턴과 맞지 않기 때문에, 고려되지 않습니다. 물론, ps -f 1로 알아올 수도 있긴 하겠네요.

 

 


 몇 가지 옵션들을 알아보겠습니다. -i는 대소문자 구분없이 검색하는 명령어입니다.

 

 

 예를 들어, CHO라는 패턴이 있었다고 해 봅시다. 그런데 matching이 된 것은 cho였습니다. cHo가 있어도, chO가 있어도 매칭이 됩니다. 이는, 대소문자 구분을 하지 않았기 때문입니다.

 

 

 -v는 해당 패턴과 match가 되지 않는 행들만 얻어옵니다. inversion의 줄임말입니다. 아까와는 다르게, 빨간 무언가가 없다는 것을 알 수 있습니다. 각 행을 찾아봐도, 눈을 씻고 찾아봐도 root라는 키워드 자체가 없음을 알 수 있습니다.

 

 


 이제, regex를 가지고 간단하게 놀아보도록 하겠습니다. 먼저 ^는 패턴의 시작을 의미합니다. 예를 들어서, '^2'를 생각해 보겠습니다.

 

 

 그러면, 이것은 2로 시작하는 행을 의미합니다. 다음에, 맨 끝에 $이 오면, 이는 끝을 의미합니다.

 

 

 예를 들어, '.txt$'는 패턴 .txt로 끝나는 행을 의미합니다. 그러면, 정말로 .txt로 끝나는 행만 리턴해 줄까요?

 

 

 1.txt에는 다음과 같은 내용이 있습니다.

 

 

 똑같은 패턴을 확장된 정규표현식을 쓰겠다는 E 옵션을 넣고 돌려보니, .txt 뿐만이 아니라 atxt도 매칭이 되었음을 알 수 있어요. 확장된 정규 표현식에서 .는 any character를 의미한다는 것을 알 수 있어요.

 

 

 -E 옵션 없이 찍어도 마찬가지로 나오는군요.

 

 

 그러면 '.c$'는 무엇을 의미할까요? 아무 문자 하나 나오고, c로 끝나는 패턴을 모두 찾겠다는 의미입니다. 그러면 .c로 끝나는 열 뿐만이 아니라, rc로 끝나는 것도 찾을 겁니다. 정확하게 .c로 끝나는 패턴을 찾으려면 어떻게 해야 할까요?

 

 

 '[.]c$'를 적어주시면 됩니다. 여기서 [.]는 .만 와야 한다는 것을 의미합니다. 반대로 문자 + c로 끝나는데, .c로 끝나는 패턴을 찾고 싶지 않다고 한다면 어떻게 하면 될까요? 단지, .을 스캔 집합에 넣지 않으면 됩니다.

 

 

 그렇게 하려면, '[^.]c$'로 작성해 주시면 됩니다. [^.]은 문자 .을 제외한 나머지 문자들을 집합으로 삼는다는 의미입니다. 이제 아래의 regex를 해석해 보도록 하겠습니다.

 

 

 ^는 시작을 의미합니다. 그리고 [0-9]가 나옵니다. 이는 문자 0,1,2,3,4,5,6,7,8,9를 유효 집합으로 삼겠다는 것입니다. [a-z]는 소문자를, [A-Z]는 대문자를 유효 집합으로 삼겠다는 것입니다. 그리고 {6}은 정확하게 패턴이 6번 반복된다는 것을 의미하는데요. 앞에를 보니까 숫자 집합이라 되어 있어요. 그러면 숫자 6개가 나오는 패턴으로 시작을 한다는 것을 의미해요. 이렇게 inode 값이 나오고, 그 다음에 10자리의 drwxrwxrwx로 이루어진 문자열이 나옵니다.

 

 1번째는 디렉토리이면 d를, 아니면 -입니다. 그러면, 일단 디렉토리가 아닌 것만 찾겠네요. 다음에, 6개의 .이 나온 걸로 보아서는, 그룹이나 소유자에 대한 권한은 어떤 것이나 상관이 없고요. 그 다음에 r이 나오는데요. 이것은, 다른 사람이 이 파일을 읽을 수 있다는 것을 나타냅니다. 즉, 위 명령의 결과는 inode 값이 6자리 수이고, 나와 그룹이 아닌 다른 사람이 read 권한을 가진 파일들을 출력하는 명령입니다.