CS/OS

운영체제 : 3.Linux OS 이용/관리 : 3.명령어 : 3. 와일드카드/정규표현식

OSP 2024. 12. 6. 00:27

3. Linux OS 이용/관리


3.3. 명령어


3.3.3. 와일드카드/정규표현식

3.3.3.1. 와일드카드.

  • wildcard. 명령어라기 보다는 명령어에 부수적으로 사용되는 대체 문자(열)이다.
  • 패턴매칭을 위한 특수 문자로, 동일한 표식을 사용하는 파일/디렉토리/내용을 색출하고자 할 때 사용한다. 주로 파일/디렉토리를 솎아내기에 좋다.
  • 동일한 표식이라도 결합되는 명령어에 따라 와일드카드가 되기도 하고 정규표현식이 되기도 하기에 주의해야 한다.
  • 정규표현식에 대비 상대적으로 단순하고 직관적인 대신, 제한적이다. 와일드카드를 쉽게 비유하자면 "한 번에 끝까지"라고 할 수 있다.
  • ls, cp, mv, rm, find, tar, echo은 와일드카드를 채택한다.

3.3.3.1.1. *

  • 0개 이상의 임의의 문자를 대체한다.
  • 정규표현식과 구별되고, 추출내용도 꽤나 다르기에 주의해야 한다. (와일드카드 *는 정규표현식의 .*과 비슷한 면도 있으나 분명히 다른 결과를 추출한다.)
형태 내용 예시
*.txt .txt로 끝나는 test.txt 등
abc* abc로 시작하는 abc, abcxy, abcmde.exe 등
*cde cde로 끝나는 cde, xycde 등
*abc* abc를 포함하는 abc, xyabc, abcxy, xyabc.ssh 등
abc*def abc로 시작하고 def로 끝나는 abcxydef 등
*abc*def* abc로 시작하고 def*로 끝나는 절을 포함하는 생략
abc\** abc*로 시작하는 abc*, abc*x, abc*y 등

ls의 *은 와일드카드이다. test*은 test로 시작하는, test*txt는 test로 시작해서 txt로 끝나는 것을 의미한다.


3.3.3.1.2. ?

  • 해당 위치의 1개의 임의의 문자를 대체한다.
  • ?(ASCII 63)가 목적이라면 이스케이프 문자를 활용해 \?라 써야 한다.
형태 내용 예시
abc? abc뒤에 하나의 문자를 포함하는
(abc로 시작하는 네 문자)
abcx, abcy 등
?abc abc 앞에 하나의 문자를 포함하는
(abc로 끝나는 네 문자)
xabc, yabc 등
a?bc a와 bc 사이에 하나의 문자를 포함하는
(a로 시작해 bc로 끝나는 네 문자)
axbc, aybc 등
abc\?? abc? 뒤에 하나의 문자를 포함하는
(abc?로 시작하는 다섯 문자)
abc?x, abc?y 등

? 와일드카드의 경우에는 아주 야생적이다 한 번에 밀어버리고 끝낸다. 정규표현식이라면 tes?나 ???test에서 저것만 나오지는 않았을 것이다.


3.3.3.1.3. []

  • Character Class. 문자클래스로, 대괄호 안의 지정 문자들의 집합에 속한 하나와 일치하는 문자를 대체한다.
  • 안에 포함된 ,은 ASCII44로서 인식된다. {}에서는 구분자로 인식된다.
  • 문자클래스 안에서 ^로 시작하면 부정클래스로, 대괄호 안의 지정 문자들의 집합에 속하지 않은 하나와 일치하는 문자를 대체한다.
형태 내용 예시
file[a2bCd].txt file과 .txt사이에 a,2,b,C,d중 하나를 포함하는 filea.txt, file2.txt, fileb.txt, fileC.txt, filed.txt
file[a-z].txt file과 .txt사이에 a부터 z중 하나를 포함하는 filea.txt, fileb.txt ... filey.txt, filez.txt
file[a-z0-9].txt file과 .txt 사이에 a부터z, 0부터9중 하나를 포함하는 filea.txt, fileb.txt ... filey.txt, filez.txt, file0.txt, file1.txt ... file8.txt, file9.txt
[^abc].txt a,b,c가 아닌 1문자로 시작해서 .txt로 끝나는 d.txt, e.txt, ... y.txt, z.txt, 0.txt, ... 9.txt 등
[ab][cd].txt 처음은 a또는b, 두번쨰는 c또는d이고 .txt로 끝나는 ac.txt, ad.txt, bc.txt, bd.txt
file[a,b].txt file과 .txt 사이에 a,",",b중 하나를 포함하는 filea.txt, file,.txt, fileb.txt
[abc]???.* a,b,c중 하나와 임의의 세 문자와 "."로 시작하는 axyz.txt, bxyz.txt, cxyz.txt, adef.exe, btdx.ssh 등
file\[a\].txt 이스케이프 file[a].txt

[], ?, * 와일드카드를 결합하여 사용하는 예시이다.


3.3.3.1.4. {}

  • Brace Expansion. 중괄호 안에서 쉼표로 구분된 여러 문자열들을 한 번에 대체한다.(중괄호 확장)
  • 안에 포함된 ,은 구분자를 의미하며, ASCII 44의 ,를 원하면 \,로 써야 한다.
형태 내용 예시
{a,b,c}.txt (a로시작하고 .txt로 끝나는) and (b로 시작하고 .txt로 끝나는) and (c로 시작하고 .txt로 끝나는) a.txt, b.txt, c.txt
{a..c}.txt (a로 시작하고 .txt로 끝나는) and (b로 시작하고 .txt로 끝나는) and (c로 시작하고 .txt로 끝나는) a.txt, b.txt, c.txt
{a..c,0..2}.txt (a로 시작하고 .txt로 끝나는) and (b로 시작하고 .txt로 끝나는) and (c로 시작하고 .txt로 끝나는) and (0으로 시작하고 .txt로 끝나는) and (1로 시작하고 .txt로 끝나는) and (2로 시작하고 .txt로 끝나는) a.txt, b.txt, c.txt, 0.txt, 1.txt, 2.txt
{abc,cde}.txt (abc로 시작하고 .txt로 끝나는) and (cde로 시작하고 .txt로 끝나는) abc.txt, cde.txt
{a..c,\,}.txt (a로 시작하고 .txt로 끝나는) and (b로 시작하고 .txt로 끝나는) and (c로 시작하고 .txt로 끝나는) and (,로 시작하고 .txt로 끝나는) a.txt, b.txt, c.txt, ,.txt
\{a,b\}.txt 이스케이프 {a,b}.txt

중괄호 확장은 한 번에 병렬적으로 여러 출력을 만들 때 사용된다. 앞선 와일드카드들과는 사뭇 다르다.


3.3.3.2. 정규표현식

  • regular expression. 명령어라기 보다는 명령어에 부수적으로 사용되는 대체 문자(열)이다.
  • 패턴매칭을 위한 특수 문자로, 동일한 표식을 사용하는 파일/디렉토리/내용을 색출할 수 있다. 주로 파일 내용을 솎아내기에 좋다.
  • 동일한 표식이라도 결합되는 명령어에 따라 와일드카드가 되기도 하고 정규표현식이 되기도 하기에 주의해야 한다. 
  • 와일드카드 대비 상대적으로 정교한 대신, 기술적인 분석이 필요하다. POSIX 표준 문법에 따른다.
  • grep, find -regex은 정규표현식을 채택한다.

3.3.3.2.1. *

  • 바로 앞의 문자와 동일한 문자 0개 이상으로 대체한다.
  • .은 모든 문자를 대체할 수 있으며, .(ASCII 46)을 찾으려면 이스케이프문자를 활용해 \.라 써야 한다. 놓치기 쉬우니 조심해야 한다.
  • 끝나거나 시작하기 위해서는 시작/끝 지시자와 함께 해야 한다.
  • 와일드카드와의 구별되고, 추출내용도 꽤 다르기에 주의해야 한다.
예시 내용 예시
*.txt * 앞에 문자가 없어 에러  
.*.txt 1개 이상의 임의의 문자열 뒤에 txt로 이어지는 것을 포함하는
(txt로 끝나는 것과는 다름)
xtxt, xytxt, xyztxt,
(xtxtx, xytxtx, xyztxtxy 등)
.*\.txt 0개 이상의 임의의 문자열 뒤에 .txt로 이어지는 것을 포함하는
(.txt로 끝나는 것과는 다름)
.txt, x.txt, xy.txt 등
(.txtx, x.txtxy, xy.txtx, xy.txtxyz 등)
.*\.txt$ 0개 이상의 임의의 문자열 뒤에 .txt로 이어지고 끝나는  
.*cde 0개 이상의 임의의 문자열 뒤에 cde로 이어지는 것을 포함하는
(cde로 끝나는 것과는 다름)
cde, xcde, xycde 등
(cdex, xcdexy, xycdex 등)
abc* ab뒤에 0개 이상의 c를 포함하는
(ab로 시작하는 것과는 다름)
ab, abc, abcc 등
(xab, xabc, xyzabccc 등)
abc.* ab 뒤에 0개 이상의 임의의 문자열로 이어지는 것을 포함하는
(abc로 시작하는 것과는 다름)
abc, abcx, abcxy 등
(xabc, yabcx, xyzabcezy 등)
.*abc.* abc 앞뒤로 0개 이상의 임의의 문자열로 이어지는 것을 포함하는
(abc를 포함하는)
abc, xyabc, abcxy, xyabcxy 등
abc*def ab 뒤에 0개 이상의 c를 포함하고 def로 이어지는 것을 포함하는
(ab로 시작해 def로 끝나는 것과는 다름)
abdef, abcdef, abccdef 등
(xabdef, xabcdefy, xyabccdefz 등)
abc.*def abc와 def 사이에 0개 이상의 문자를 두는 것을 포함하는
(abc로 시작해 def로 끝나는 것과는 다름)
abcdef, abcxdef, abcxydef 등
(xabcdef, xabcxdefz, xyabcxydefzy 등)

ls의 와일드카드는 *부터 끝까지 밀어버린 반면, grep의 정규표현식은 끝난 지점부터 다시 시작한다. 이런 동작 떄문에 와일드카드는 디렉토리/파일 추줄에 유리하고, 정규표현식은 내용 추출에 유리하다. 만약 내용 추출에 와일드카드를 써버리면 찾을 수 있는 정보가 급격히 좁아진다.

 


3.3.3.2.2. +

  • 바로 앞의 문자와 동일한 문자 1개 이상으로 대체한다.
형태 내용 예시
a+ a가 1개 이상 있는 a, aa, aaa 등
a+b a가 1개 이상 있고 b가 있는 ab, aab, aaab 등
(abc)+d abc가 1개 이상 있고 d가 있는 abcd, abcabcd, abcabcabcd 등
[abc]+d a,b,c중 하나가 1개 이상 있고 d가 있는 ad, aad .. , bbd, bbd .. , cd, ccd .. 등
abc\+d+e abc+가 있고 d가 1개 이상 있고 e가 있는 abc+de, abc+dde, abc+ddde 등
(\[abc\])+d [abc]가 1개 이상 있고 d가 있는 [abc]d, [abc][abc]d, [abc][abc][abc]d

3.3.3.2.3. ?

  • quantifier. 바로 앞의 문자와 동일한 문자 0개 또는 1개로 대체한다.
형태 내용 예시
a? a가 0개나 1개 있는 , a
colou?r colo다음에 u가 0개나 1개 있고 r이 있는 color, colour
c(ach)?e c다음에 ach가 0개나 1개 있고 e가 있는 ce, cache
[aeioi]?\? a,e,i,o,u중 하나가 0기나 1개 있고 ?가 있는 ?, a?, e?, i?, o?, u?

3.3.3.2.4. {}

  • 지정한 개수만큼 앞의 문자와 동일한 문자로 대체한다.
형태 내용 예시
a{3} a를 3번 반복하는 aaa
ab{2,4} a뒤에 b를 2-4번 반복하는 abb, abbb, abbbb
[ab]{4} a또는 b를 4번 반복하는
(=[ab][ab][ab][ab])
aaaa, aaab, aaba, abaa, baaa, abab, abba, bbba, bbbb 등

3.3.3.2.5. []

  • Character Class. 문자클래스로, 대괄호 안의 지정 문자들의 집합에 속한 하나와 일치하는 문자를 대체한다.
  • 기본적으로는 와일드카드의 그것과 같다. 다만 [
형태 내용 예시
find -regex "[ab][6}" a또는b가 6개 있는 ababab, babaab, aaabbb 등
(find는 경로값을 출력하기에 /조차 없는 이는 찾아질 수 없다.)
find -regex ".*[ab]{6}" 0개 이상의 문자 뒤에 a또는b가 6개 있는
(a또는b 여섯개로 끝나는)
/home/osp/ababab, /home/osp/babaab, ./aaabbb 등.
(/home/osp/abababcdcd 등은 해당 없음)
grep -E ".*[ab]{2}" 0개 이상의 문자 뒤에 a또는 b가 2개 있는
(a또는b 여섯개로 끝나는 것은 아님)
하기 예시 참조

 

{}은 POSIX확장형이 필요하기에 grep에선 -E, find에서는 -regextype posix-extended로 확장한 모습이며, grep에서 볼 수 있듯 0개 이상의 문자 뒤에 a또는b가 2개 있는 모든 것들이 빨갛게 필터링 된 모습이다. 그러나 find에서는 조건이 전부 충족한 것이 출력되기 떄문에 전부 빨간 하나만 출력된 모습.

 

.*[ab]{2}는 $지시자 없이도 맨 마지막에 a또는 b가 있어야 한다.

 


3.3.3.2.6. ^, $

  • 행의 시작, 끝 지시자. 해당 위치가 행의 시작 또는 끝임을 표시한다.
  • 정규표현식은 와일드카드처럼 끝까지 밀어버리는 야생마가 아니기 때문에 이런 지시자가 필요할 때가 있다. 
형태 내용 예시
^abc.* abc로 시작하는 abc, abcx, abcxy 등
*abc$ abc로  끝나는 abc, xabc, xyabc 등

정규표현식 .*test는 test가 행의 마지막일 것까지는 요구하지 않는다. 정규표현식 .*abc$ = 와일드카드 *abc라고 할 수 있다. 마찬가지로 와일드카드 abc* = 정규표현식 ^abc.* 라고 할 수 있다.
와일드카드에서는 없는 연산자를 쓰려면 정규표현식을 확장해야 한다.(-regtype 옵션) find 명령은 경로를 포함한 산출값에서 조건을 따진다.([ab]{6} 앞에 .*이 붙은 이유)


3.3.3.3. \

  • escape. 문법상 ASCII가 아니라 연산자로 우선 인식되는 *, [], $ 등을 연산자로부터 벗어나 ASCII로 쓰이게 한다.
  • 구체적인 예시는 상기에 곳곳에 녹아 있다.