웹사이트 검색

내가 계속 리눅스 터미널로 돌아오게 만드는 5가지 Bash 원라이너


당신은 대부분의 시간을 터미널에서 보내나요? 항상 터미널 능력을 향상시킬 방법을 찾고 있나요? 저처럼 문제 해결의 새로운 방법을 배우는 것을 좋아한다면, 그것들은 이전에는 상상도 못한 개념을 소개해 주기 때문입니다. 저는 일반적인 문제를 해결하는 다섯 가지 한 줄 터미널 명령어를 가지고 있으며, 아마 그것들은 당신에게도 새로운 개념을 소개해 줄 것입니다.

브레이스 확장을 사용한 mkdir

중괄호 확장은 명령어 길이를 줄이고 모든 것에 적용됩니다

이 첫 번째 것은 단일 명령을 넘어 적용되는 재사용 가능한 트릭입니다.

mkdir --parents foo/{bar,baz}

그 명령은 다음과 같은 디렉토리 구조를 생성합니다:

foo/
├── bar/
└── baz/

"--parents"(또는 -p) 플래그는 부모 디렉터리가 먼저 생성되도록 보장합니다. 중괄호는 마법이 일어나는 곳입니다. Bash에서 이것을 브레이스 확장(brace expansions)이라고 부르며, 매우 간단합니다. Bash는 위 명령어를 다음과 같이 처리합니다:

mkdir --parents foo/bar
mkdir --parents foo/baz

모든 명령어에서 중괄호 확장을 사용할 수 있습니다. 공식 문서에서:

chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}

Bash는 먼저 내부 중괄호를 평가하며, 이전 경로 표현식은 다음과 같이 됩니다:

/usr/ucb/ex
/usr/ucb/edit
/usr/lib/ex?.?*
/usr/lib/how_ex

"?"와 "*"는 글롭(globs)으로, 각각 임의의 한 문자와 0개 이상의 문자를 매칭합니다.

저는 주로 mkdir과 함께 직관적인 중괄호 확장을 사용하므로, 두 번째(복잡한) 표현식에 주눅 들지 마세요.

줄 수 또는 단어 수

단일 스트림을 생성하고 이를 wc로 파이프하십시오

나는 내 소프트웨어 프로젝트의 코드 줄 수나 내 노트의 단어 수를 세기 위해 가끔 이 명령어를 사용한다.

cat **/*.go | wc --lines   # Count code lines.
cat **/*.org | wc --words  # Count words in notes.

완전한 계산을 하기 위해서는 'wc'로 전달되는 단일 데이터 스트림이 필요합니다. 만약 단순히 wc --words **/*.org를 실행했다면, 각각의 파일마다 하나씩 수백 개의 결과를 얻게 될 것입니다. 나열된 각 명령어는 단일 데이터 스트림을 전달합니다.

두 프로세스 출력 비교

프로세스 대체는 diff 명령어를 훨씬 더 유용하게 만듭니다

두 파일을 비교할 수 있는 diff에 익숙할 수도 있습니다:

diff foo.txt bar.txt

그러나 프로세스 치환(process substitutions)에 대해 알지 못할 수도 있습니다. 이를 통해 두 개의 명령어를 실행하고 그 출력물을(diff와 같은 명령어에 임시 파일 경로로써) 전달할 수 있습니다:

diff <(ls ./foo) <(ls ./bar)

다음과 같은 디렉토리 구조가 주어졌다고 합시다 (둘 다 "two"라는 이름의 파일을 가지고 있습니다):

.
├── bar
│   ├── three
│   └── two
└── foo
    ├── one
    └── two

">"는 오른쪽 프로세스 대체("<(ls ./bar)")가 "three"라는 파일을 나열하지만 왼쪽은 그렇지 않다는 것을 나타냅니다. 같은 원리가 "<"에도 적용됩니다.

더 유용한 접근 방식은 디렉터리의 기준을 정하는 것(ls ~/foo > foo-baseline.txt)이고, 이를 현재 목록과 비교하는 것입니다:

diff foo-baseline.txt <(ls ~/foo)

이제 우리는 디렉토리에 대한 모든 변경 사항을 볼 수 있습니다. 이는 특히 다음에 다룰 watch를 사용할 때 유용합니다.

프로세스 치환을 사용하면 두 명령을 비교할 수 있으므로 단순한 "ls" 명령보다 더 멀리 상상력을 발휘할 수 있습니다.

명령 출력 보기

변화를 모니터링하는 것이 종종 필요하며, 'watch'는 유연합니다

"watch" 유틸리티는 매우 간단합니다: 매 2초마다 명령을 폴링하여 변화를 모니터링할 수 있게 해줍니다.

간단한 예는 수신 포트를 모니터링하는 것입니다:

watch ss -altpn

화면을 지우고 작은 헤더와 함께 명령 출력만 표시합니다.

--color 플래그는 ANSI 코드를 해석하고, --differences는 반복 간의 변화를 보여줍니다. 그러나 결과는 다양하며 다소 신뢰할 수 없습니다.

디렉토리를 모니터링하고 차이를 표시하기 위해 "watch"를 사용할 수 있습니다:

watch "bash -c 'diff foo-baseline.txt <(ls -1 foo/)'"

"watch" 명령은 Bash 프로세스 치환을 지원하지 않는 sh를 사용합니다. 이를 활성화하려면 diff를 명시적으로 Bash를 통해 실행하세요.

파일 ("1")을 생성하면 diff ("2")에 표시됩니다. 이제 디렉터리 변경 사항에 대한 거의 실시간 업데이트를 diff로 받을 수 있습니다.

특정 패턴 사이에서 grep

때때로 텍스트의 일부를 잘라내고 싶을 때가 있습니다

Grep은 전체 라인을 매치하지만, 때때로 패턴과 일치하는 부분만 원할 수 있습니다. 예를 들어, HTML 태그의 내용만 추출하고 싶다면:

<body>
  <p>The text we care about.</p>
</body>
grep -oP '(?<=<p>).+(?=</p>)'

  • "-o": 전체가 아닌 일치하는 부분만 반환합니다.
  • "-P": 긍정형 전방 탐색과 후방 탐색을 가능하게 하는 Perl 호환 정규식을 사용합니다.
  • "(?<=

    )": 긍정적 전방탐색입니다. 이는 패턴(".+")을 매칭할 때 엔진이 뒤를 돌아보고 "

    "도 일치하는지 확인한다는 것을 의미합니다.

  • "(?=</p>)": 긍정 전방 탐색입니다. 긍정 후방 탐색과 비슷하지만, 앞으로 바라본다는 점이 다릅니다.

본질적으로, 정규식은 ".+" (임의의 문자, 하나 이상)과 일치하고 양쪽을 살펴 "<p>"와 "</p>"도 일치하는지 확인합니다. 일치하지 않으면 매칭이 실패합니다. 이를 통해 "p" 태그를 대상으로 할 수 있습니다. 원하는 패턴을 사용할 수 있으며, 저는 단지 HTML을 예로 들었습니다. 예를 들어:

grep -oP '(?<=foo).+(?=bar)'

그 명령은 "foo"와 "bar" 사이의 모든 것과 일치할 것입니다.

이전 버전의 PCRE는 고정 길이의 전방 탐색만 허용했습니다 (?, +, * 사용 불가). 그러나 버전 10.43(PCRE2) 이후로는 조정 가능한 제한을 허용하며(기본값 255자), 이 제한은 매우 비효율적인 파싱을 방지하기 위해 존재했습니다. grep --version 명령을 실행하면 어떤 PCRE 버전을 사용하는지 확인할 수 있습니다.

관심이 있을 수 있는 정규식에 대한 훨씬 더 심층적인 가이드가 있습니다. 이 가이드는 모든 기본 요소를 다룹니다.


이 명령어들은 매우 상황에 따라 다르지만, 많은 다른 경우에 적용될 수 있는 통찰을 제공합니다. 중괄호 확장은 거의 모든 명령어에 적용될 수 있으며, 특히 파일 시스템 경로에서 유용합니다. Watch는 제가 자주 사용하는 것이고, diff는 변경 사항을 모니터링해야 하는 상황에서 사용됩니다. Grep과 정규 표현식(regex)은 특히 강력하지만, 과거에는 특정 텍스트 블록을 잘라낼 수 없는 경우가 많았지만, 이제는 저는 방법을 알고 있으며, 당신도 그렇습니다.

관련기사