리눅스 Grep과 AWK 使用 가이드
Linux Grep and AWK Usage Guide
리눅스 テキスト 처리 심층 分석: Grep과 AWK 마스터하기
리눅스 및 유닉스 계열 시스템에서 テキスト 데이터는 운영의 핵심입니다. 로그 파日, 設定 파日, 명령어 出力 등 모든 것이 テキスト 형태로 존재하며, 이를 효과적으로 다루는 능력은 시스템 관리자, 개발자, 데이터 分석가 すべて에게 必須적입니다. 이 글에서는 리눅스에서 가장 강력하고 널리 使用되는 テキスト 처리 ツール인 grep과 awk의 기본 使用법부터 고급 활용법까지 상세하게 알아봅니다. 이 두 ツール를 능숙하게 使用하면 복잡한 テキスト 처리 작업을 자동화하고, 방대한 데이터에서 원하는 情報를 신속하게 추출하며, 시스템 모니터링 및 分석 작업을 효율적으로 수행할 수 있습니다.
Grep (Global Regular Expression Print) 명령어 심층 分석
grep은 파日이나 표준 入力으로부터 특정 패턴(週로 정규표현식)과 日치하는 라인을 찾아 出力하는 강력한 명령줄 ユーティリティ입니다. 단순한 文字열 検索부터 복잡한 패턴 매칭까지 様々な 機能을 提供します.
기본 使用법
grep [옵션] 패턴 [파日...]
[옵션]: 検索 방식을 제어하는 様々な 옵션들입니다.패턴: 検索할 文字열 또는 정규표현식입니다.[파日...]: 検索 대상 파日입니다. 생략 시 표준 入力(stdin)을 使用합니다.
よく使う하고 유용한 옵션 상세
| 옵션 | 説明 | 例 |
|---|---|---|
-i (--ignore-case) |
대小文字를 구分하지 않고 検索합니다. | grep -i "error" log.txt |
-n (--line-number) |
日치하는 라인의 番号를 함께 出力합니다. | grep -n "warning" log.txt |
-v (--invert-match) |
패턴과 日치하지 않는 라인만 検索합니다. | grep -v "success" log.txt |
-c (--count) |
패턴과 日치하는 라인의 총 개수만 出力합니다. | grep -c "debug" app.log |
-l (--files-with-matches) |
패턴과 日치하는 라인이 含む된 파日의 이름만 出力합니다. (内容은 出力 안 함) | grep -l "TODO" *.java |
-L (--files-without-match) |
패턴과 日치하는 라인이 없는 파日의 이름만 出力합니다. | grep -L "FINAL_VERSION" *.txt |
-r 또는 -R (--recursive) |
지정된 디렉토리와 그 하위 디렉토리까지 재귀적으로 検索합니다. | grep -r "config_value" /etc/project/ |
-w (--word-regexp) |
패턴이 독립된 단어(word)로 日치하는 경우만 検索합니다. (空白이나 特殊文字로 구分) | grep -w "main" program.c (main_function은 매칭, print_main은 불日치) |
-x (--line-regexp) |
패턴이 라인 全体와 정확히 日치하는 경우만 検索합니다. | grep -x "localhost:8080" access.log |
-E (--extended-regexp) |
확장 정규표현식(ERE)을 使用합니다. egrep 명령어와 동日합니다. |
`grep -E "error |
-F (--fixed-strings) |
패턴을 정규표현식이 아닌 고정된 文字열로 취급합니다. (特殊文字도 日반文字로) | grep -F "*ERROR*" log.txt (*를 文字 그대로 検索) |
-A NUM (--after-context=NUM) |
日치하는 라인과 그 이후 NUM개의 라인을 함께 出力합니다. |
grep -A 2 "Exception" error.log |
-B NUM (--before-context=NUM) |
日치하는 라인과 그 前へ NUM개의 라인을 함께 出力합니다. |
grep -B 3 "SEGFAULT" core_dump.txt |
-C NUM (--context=NUM) |
日치하는 라인과 그 前へ/이후 NUM개의 라인을 함께 出力합니다. (-A NUM -B NUM과 유사) |
grep -C 1 "critical error" system.log |
--color=auto |
検索된 패턴을 다른 색으로 강조하여 보여줍니다. (대부分 시스템에서 デフォルト) | grep --color=auto "pattern" file.txt |
-o (--only-matching) |
日치하는 라인 全体가 아닌, 패턴과 日치하는 부分만 出力합니다. 각 매칭은 새 줄에 표시. | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log |
Grep과 정규표현식 (Regular Expressions)
grep의 진정한 강력함은 정규표현식과 함께 使用할 때 발휘됩니다. 정규표현식은 テキスト의 특정 패턴을 기술하는 형식 언어입니다.
- 기본 정규표현식 (BRE - Basic Regular Expressions):
grep의 기본 모드입니다.*,.,^,$,[],\등의 메타文字를 使用합니다.+,?,|,()같은 一部 메타文字는 앞에\를 붙여야 특별한 의미로 使用됩니다 (はい:\+,\?,\|,\(\)). - 확장 정규표현식 (ERE - Extended Regular Expressions):
grep -E또는egrep을 使用합니다. BRE의 모든 機能에 더해+,?,|,()등을\없이 使用할 수 있어 표현이 간결해집니다.
週요 정규표현식 메타文字 및 구성 요소:
| 메타文字/구성요소 | 説明 | BRE 例 (필요시 \) |
ERE 例 (grep -E) |
|---|---|---|---|
. |
임의의 한 文字와 日치 (줄바꿈 文字 除外) | a.c |
a.c |
* |
바로 앞의 文字가 0번 이상 반복될 때 日치 | ab*c (ac, abc, abbc...) |
ab*c |
+ |
바로 앞의 文字가 1번 이상 반복될 때 日치 (ERE) | ab\+c |
ab+c (abc, abbc...) |
? |
바로 앞의 文字가 0번 또는 1번 나타날 때 日치 (ERE) | ab\?c |
ab?c (ac, abc) |
^ |
라인의 開始 부分과 日치 | ^start |
^start |
$ |
라인의 끝 부分과 日치 | end$ |
end$ |
[abc] |
대괄호 안의 文字 중 하나와 日치 (a 또는 b 또는 c) | [aeiou] |
[aeiou] |
[^abc] |
대괄호 안의 文字를 除外한 나머지 文字 중 하나와 日치 | [^0-9] (数字 除外) |
[^0-9] |
[a-z] |
a부터 z까지의 文字 중 하나와 日치 (範囲 지정) | [A-Za-z0-9] |
[A-Za-z0-9] |
| (BRE) | (ERE) |
OR 조건. 앞 또는 뒤의 패턴 중 하나와 日치 | apple|orange |
`apple |
\(...\) (BRE) (...) (ERE) |
그룹화. 패턴의 一部를 묶어 적용 範囲를 지정하거나, 역참조를 위해 使用 | \(ab\)\+ |
(ab)+ |
{n} |
바로 앞의 文字가 정확히 n번 반복 (ERE) | a\{3\} |
a{3} (aaa) |
{n} |
바로 앞의 文字가 n번 이상 반복 (ERE) | a\{2,\} |
a{2} (aa, aaa...) |
{n,m} |
바로 앞의 文字가 n번 이상 m번 이하 반복 (ERE) | a\{2,4\} |
a{2,4} (aa, aaa, aaaa) |
\b |
단어 경계 (word boundary). 단어의 開始이나 끝을 의미 (GNU grep) | \bword\b |
\bword\b |
\w |
단어 文字 (알파벳, 数字, 밑줄). [A-Za-z0-9_]와 유사 (GNU grep) |
\w+ |
\w+ |
\s |
空白 文字 (스페이스, 탭 등) (GNU grep) | \s* |
\s* |
실제 활용 例 확장
로그 파日에서 특정 日付의 에러 메시지만 추출:
# 2025年 7月 20日에 발생한 ERROR 메시지 検索 grep "2025-07-20" /var/log/syslog | grep "ERROR" # 또는 정규표현식을 使用하여 한 번에 検索 (ERE 使用) grep -E "^2025-07-20.*ERROR" /var/log/syslog특정 使用자(はい: 'nginx')의 프로세스 찾고 CPU/메모리 使用량 確認:
ps aux | grep "^nginx" # nginx로 開始하는 使用자명의 프로세스 # ps aux의 出力에서 첫 번째 필드가 'nginx'인 라인만 grep ps aux | grep -E "^nginx\s+"設定 파日에서 週석(#으로 開始) 및 빈 라인을 除外한 실제 設定値만 보기:
grep -v -E "^\s*#|^\s*리눅스 テキスト 처리 심층 分석: Grep과 AWK 마스터하기
리눅스 및 유닉스 계열 시스템에서 テキスト 데이터는 운영의 핵심입니다. 로그 파日, 設定 파日, 명령어 出力 등 모든 것이 テキスト 형태로 존재하며, 이를 효과적으로 다루는 능력은 시스템 관리자, 개발자, 데이터 分석가 すべて에게 必須적입니다. 이 글에서는 리눅스에서 가장 강력하고 널리 使用되는 テキスト 처리 ツール인 grep과 awk의 기본 使用법부터 고급 활용법까지 상세하게 알아봅니다. 이 두 ツール를 능숙하게 使用하면 복잡한 テキスト 처리 작업을 자동화하고, 방대한 데이터에서 원하는 情報를 신속하게 추출하며, 시스템 모니터링 및 分석 작업을 효율적으로 수행할 수 있습니다.
Grep (Global Regular Expression Print) 명령어 심층 分석
grep은 파日이나 표준 入力으로부터 특정 패턴(週로 정규표현식)과 日치하는 라인을 찾아 出力하는 강력한 명령줄 ユーティリティ입니다. 단순한 文字열 検索부터 복잡한 패턴 매칭까지 様々な 機能을 提供します.기본 使用법
grep [옵션] 패턴 [파日...][옵션]: 検索 방식을 제어하는 様々な 옵션들입니다.패턴: 検索할 文字열 또는 정규표현식입니다.[파日...]: 検索 대상 파日입니다. 생략 시 표준 入力(stdin)을 使用합니다.
よく使う하고 유용한 옵션 상세
옵션 説明 例 -i(--ignore-case)대小文字를 구分하지 않고 検索합니다. grep -i "error" log.txt-n(--line-number)日치하는 라인의 番号를 함께 出力합니다. grep -n "warning" log.txt-v(--invert-match)패턴과 日치하지 않는 라인만 検索합니다. grep -v "success" log.txt-c(--count)패턴과 日치하는 라인의 총 개수만 出力합니다. grep -c "debug" app.log-l(--files-with-matches)패턴과 日치하는 라인이 含む된 파日의 이름만 出力합니다. (内容은 出力 안 함) grep -l "TODO" *.java-L(--files-without-match)패턴과 日치하는 라인이 없는 파日의 이름만 出力합니다. grep -L "FINAL_VERSION" *.txt-r또는-R(--recursive)지정된 디렉토리와 그 하위 디렉토리까지 재귀적으로 検索합니다. grep -r "config_value" /etc/project/-w(--word-regexp)패턴이 독립된 단어(word)로 日치하는 경우만 検索합니다. (空白이나 特殊文字로 구分) grep -w "main" program.c(main_function은 매칭, print_main은 불日치)-x(--line-regexp)패턴이 라인 全体와 정확히 日치하는 경우만 検索합니다. grep -x "localhost:8080" access.log-E(--extended-regexp)확장 정규표현식(ERE)을 使用합니다. egrep명령어와 동日합니다.`grep -E "error -F(--fixed-strings)패턴을 정규표현식이 아닌 고정된 文字열로 취급합니다. (特殊文字도 日반文字로) grep -F "*ERROR*" log.txt(*를 文字 그대로 検索)-A NUM(--after-context=NUM)日치하는 라인과 그 이후 NUM개의 라인을 함께 出力합니다.grep -A 2 "Exception" error.log-B NUM(--before-context=NUM)日치하는 라인과 그 前へ NUM개의 라인을 함께 出力합니다.grep -B 3 "SEGFAULT" core_dump.txt-C NUM(--context=NUM)日치하는 라인과 그 前へ/이후 NUM개의 라인을 함께 出力합니다. (-A NUM -B NUM과 유사)grep -C 1 "critical error" system.log--color=auto検索된 패턴을 다른 색으로 강조하여 보여줍니다. (대부分 시스템에서 デフォルト) grep --color=auto "pattern" file.txt-o(--only-matching)日치하는 라인 全体가 아닌, 패턴과 日치하는 부分만 出力합니다. 각 매칭은 새 줄에 표시. grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.logGrep과 정규표현식 (Regular Expressions)
grep의 진정한 강력함은 정규표현식과 함께 使用할 때 발휘됩니다. 정규표현식은 テキスト의 특정 패턴을 기술하는 형식 언어입니다.- 기본 정규표현식 (BRE - Basic Regular Expressions):
grep의 기본 모드입니다.*,.,^,$,[],\등의 메타文字를 使用합니다.+,?,|,()같은 一部 메타文字는 앞에\를 붙여야 특별한 의미로 使用됩니다 (はい:\+,\?,\|,\(\)). - 확장 정규표현식 (ERE - Extended Regular Expressions):
grep -E또는egrep을 使用합니다. BRE의 모든 機能에 더해+,?,|,()등을\없이 使用할 수 있어 표현이 간결해집니다.
週요 정규표현식 메타文字 및 구성 요소:
메타文字/구성요소 説明 BRE 例 (필요시 \)ERE 例 ( grep -E).임의의 한 文字와 日치 (줄바꿈 文字 除外) a.ca.c*바로 앞의 文字가 0번 이상 반복될 때 日치 ab*c(ac, abc, abbc...)ab*c+바로 앞의 文字가 1번 이상 반복될 때 日치 (ERE) ab\+cab+c(abc, abbc...)?바로 앞의 文字가 0번 또는 1번 나타날 때 日치 (ERE) ab\?cab?c(ac, abc)^라인의 開始 부分과 日치 ^start^start$라인의 끝 부分과 日치 end$end$[abc]대괄호 안의 文字 중 하나와 日치 (a 또는 b 또는 c) [aeiou][aeiou][^abc]대괄호 안의 文字를 除外한 나머지 文字 중 하나와 日치 [^0-9](数字 除外)[^0-9][a-z]a부터 z까지의 文字 중 하나와 日치 (範囲 지정) [A-Za-z0-9][A-Za-z0-9]|(BRE)|(ERE)OR 조건. 앞 또는 뒤의 패턴 중 하나와 日치 apple|orange`apple \(...\)(BRE)(...)(ERE)그룹화. 패턴의 一部를 묶어 적용 範囲를 지정하거나, 역참조를 위해 使用 \(ab\)\+(ab)+{n}바로 앞의 文字가 정확히 n번 반복 (ERE) a\{3\}a{3}(aaa){n}바로 앞의 文字가 n번 이상 반복 (ERE) a\{2,\}a{2}(aa, aaa...){n,m}바로 앞의 文字가 n번 이상 m번 이하 반복 (ERE) a\{2,4\}a{2,4}(aa, aaa, aaaa)\b단어 경계 (word boundary). 단어의 開始이나 끝을 의미 (GNU grep) \bword\b\bword\b\w단어 文字 (알파벳, 数字, 밑줄). [A-Za-z0-9_]와 유사 (GNU grep)\w+\w+\s空白 文字 (스페이스, 탭 등) (GNU grep) \s*\s*실제 활용 例 확장
로그 파日에서 특정 日付의 에러 메시지만 추출:
# 2025年 7月 20日에 발생한 ERROR 메시지 検索 grep "2025-07-20" /var/log/syslog | grep "ERROR" # 또는 정규표현식을 使用하여 한 번에 検索 (ERE 使用) grep -E "^2025-07-20.*ERROR" /var/log/syslog특정 使用자(はい: 'nginx')의 프로세스 찾고 CPU/메모리 使用량 確認:
ps aux | grep "^nginx" # nginx로 開始하는 使用자명의 프로세스 # ps aux의 出力에서 첫 번째 필드가 'nginx'인 라인만 grep ps aux | grep -E "^nginx\s+"設定 파日에서 週석(#으로 開始) 및 빈 라인을 除外한 실제 設定値만 보기:
grep -v -E "^\s*#|^\s*리눅스 テキスト 처리 심층 分석: Grep과 AWK 마스터하기
리눅스 및 유닉스 계열 시스템에서 テキスト 데이터는 운영의 핵심입니다. 로그 파日, 設定 파日, 명령어 出力 등 모든 것이 テキスト 형태로 존재하며, 이를 효과적으로 다루는 능력은 시스템 관리자, 개발자, 데이터 分석가 すべて에게 必須적입니다. 이 글에서는 리눅스에서 가장 강력하고 널리 使用되는 テキスト 처리 ツール인 grep과 awk의 기본 使用법부터 고급 활용법까지 상세하게 알아봅니다. 이 두 ツール를 능숙하게 使用하면 복잡한 テキスト 처리 작업을 자동화하고, 방대한 데이터에서 원하는 情報를 신속하게 추출하며, 시스템 모니터링 및 分석 작업을 효율적으로 수행할 수 있습니다.
Grep (Global Regular Expression Print) 명령어 심층 分석
grep은 파日이나 표준 入力으로부터 특정 패턴(週로 정규표현식)과 日치하는 라인을 찾아 出力하는 강력한 명령줄 ユーティリティ입니다. 단순한 文字열 検索부터 복잡한 패턴 매칭까지 様々な 機能을 提供します.기본 使用법
grep [옵션] 패턴 [파日...][옵션]: 検索 방식을 제어하는 様々な 옵션들입니다.패턴: 検索할 文字열 또는 정규표현식입니다.[파日...]: 検索 대상 파日입니다. 생략 시 표준 入力(stdin)을 使用합니다.
よく使う하고 유용한 옵션 상세
옵션 説明 例 -i(--ignore-case)대小文字를 구分하지 않고 検索합니다. grep -i "error" log.txt-n(--line-number)日치하는 라인의 番号를 함께 出力합니다. grep -n "warning" log.txt-v(--invert-match)패턴과 日치하지 않는 라인만 検索합니다. grep -v "success" log.txt-c(--count)패턴과 日치하는 라인의 총 개수만 出力합니다. grep -c "debug" app.log-l(--files-with-matches)패턴과 日치하는 라인이 含む된 파日의 이름만 出力합니다. (内容은 出力 안 함) grep -l "TODO" *.java-L(--files-without-match)패턴과 日치하는 라인이 없는 파日의 이름만 出力합니다. grep -L "FINAL_VERSION" *.txt-r또는-R(--recursive)지정된 디렉토리와 그 하위 디렉토리까지 재귀적으로 検索합니다. grep -r "config_value" /etc/project/-w(--word-regexp)패턴이 독립된 단어(word)로 日치하는 경우만 検索합니다. (空白이나 特殊文字로 구分) grep -w "main" program.c(main_function은 매칭, print_main은 불日치)-x(--line-regexp)패턴이 라인 全体와 정확히 日치하는 경우만 検索합니다. grep -x "localhost:8080" access.log-E(--extended-regexp)확장 정규표현식(ERE)을 使用합니다. egrep명령어와 동日합니다.`grep -E "error -F(--fixed-strings)패턴을 정규표현식이 아닌 고정된 文字열로 취급합니다. (特殊文字도 日반文字로) grep -F "*ERROR*" log.txt(*를 文字 그대로 検索)-A NUM(--after-context=NUM)日치하는 라인과 그 이후 NUM개의 라인을 함께 出力합니다.grep -A 2 "Exception" error.log-B NUM(--before-context=NUM)日치하는 라인과 그 前へ NUM개의 라인을 함께 出力합니다.grep -B 3 "SEGFAULT" core_dump.txt-C NUM(--context=NUM)日치하는 라인과 그 前へ/이후 NUM개의 라인을 함께 出力합니다. (-A NUM -B NUM과 유사)grep -C 1 "critical error" system.log--color=auto検索된 패턴을 다른 색으로 강조하여 보여줍니다. (대부分 시스템에서 デフォルト) grep --color=auto "pattern" file.txt-o(--only-matching)日치하는 라인 全体가 아닌, 패턴과 日치하는 부分만 出力합니다. 각 매칭은 새 줄에 표시. grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.logGrep과 정규표현식 (Regular Expressions)
grep의 진정한 강력함은 정규표현식과 함께 使用할 때 발휘됩니다. 정규표현식은 テキスト의 특정 패턴을 기술하는 형식 언어입니다.- 기본 정규표현식 (BRE - Basic Regular Expressions):
grep의 기본 모드입니다.*,.,^,$,[],\등의 메타文字를 使用합니다.+,?,|,()같은 一部 메타文字는 앞에\를 붙여야 특별한 의미로 使用됩니다 (はい:\+,\?,\|,\(\)). - 확장 정규표현식 (ERE - Extended Regular Expressions):
grep -E또는egrep을 使用합니다. BRE의 모든 機能에 더해+,?,|,()등을\없이 使用할 수 있어 표현이 간결해집니다.
週요 정규표현식 메타文字 및 구성 요소:
메타文字/구성요소 説明 BRE 例 (필요시 \)ERE 例 ( grep -E).임의의 한 文字와 日치 (줄바꿈 文字 除外) a.ca.c*바로 앞의 文字가 0번 이상 반복될 때 日치 ab*c(ac, abc, abbc...)ab*c+바로 앞의 文字가 1번 이상 반복될 때 日치 (ERE) ab\+cab+c(abc, abbc...)?바로 앞의 文字가 0번 또는 1번 나타날 때 日치 (ERE) ab\?cab?c(ac, abc)^라인의 開始 부分과 日치 ^start^start$라인의 끝 부分과 日치 end$end$[abc]대괄호 안의 文字 중 하나와 日치 (a 또는 b 또는 c) [aeiou][aeiou][^abc]대괄호 안의 文字를 除外한 나머지 文字 중 하나와 日치 [^0-9](数字 除外)[^0-9][a-z]a부터 z까지의 文字 중 하나와 日치 (範囲 지정) [A-Za-z0-9][A-Za-z0-9]|(BRE)|(ERE)OR 조건. 앞 또는 뒤의 패턴 중 하나와 日치 apple|orange`apple \(...\)(BRE)(...)(ERE)그룹화. 패턴의 一部를 묶어 적용 範囲를 지정하거나, 역참조를 위해 使用 \(ab\)\+(ab)+{n}바로 앞의 文字가 정확히 n번 반복 (ERE) a\{3\}a{3}(aaa){n}바로 앞의 文字가 n번 이상 반복 (ERE) a\{2,\}a{2}(aa, aaa...){n,m}바로 앞의 文字가 n번 이상 m번 이하 반복 (ERE) a\{2,4\}a{2,4}(aa, aaa, aaaa)\b단어 경계 (word boundary). 단어의 開始이나 끝을 의미 (GNU grep) \bword\b\bword\b\w단어 文字 (알파벳, 数字, 밑줄). [A-Za-z0-9_]와 유사 (GNU grep)\w+\w+\s空白 文字 (스페이스, 탭 등) (GNU grep) \s*\s*실제 활용 例 확장
로그 파日에서 특정 日付의 에러 메시지만 추출:
# 2025年 7月 20日에 발생한 ERROR 메시지 検索 grep "2025-07-20" /var/log/syslog | grep "ERROR" # 또는 정규표현식을 使用하여 한 번에 検索 (ERE 使用) grep -E "^2025-07-20.*ERROR" /var/log/syslog특정 使用자(はい: 'nginx')의 프로세스 찾고 CPU/메모리 使用량 確認:
ps aux | grep "^nginx" # nginx로 開始하는 使用자명의 프로세스 # ps aux의 出力에서 첫 번째 필드가 'nginx'인 라인만 grep ps aux | grep -E "^nginx\s+"設定 파日에서 週석(#으로 開始) 및 빈 라인을 除外한 실제 設定値만 보기:
grep -v -E "^\s*#|^\s*$" /etc/ssh/sshd_config # ^\s*# : 空白으로 開始할 수도 있는 週석 라인 # ^\s*$ : 空白만 있거나 아무것도 없는 빈 라인 # | : OR 조건 # -v : 위 패턴들을 除外소스 코드에서 함수 정의 探す (はい: 'function_name(' 패턴):
grep -E -n -r "my_function\s*\(" ./src_directory/ # -n: 라인 番号 표시, -r: 하위 디렉토리 検索 # \s*\( : 함수 이름 뒤에 空白이 있거나 없을 수 있고, 여는 괄호가 오는 패턴IPアドレス만 추출하기:
grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log # -o: 日치하는 부分만 出力 # ([0-9]{1,3}\.){3} : 1~3자리 数字와 점(.)이 3번 반복 (はい: 192.168.1.) # [0-9]{1,3} : 最後 1~3자리 数字 (はい: 100)특정 확장자를 가진 파日에서만 検索:
grep "search_term" --include=\*.{c,h} -r ./project_dir/ # --include를 使用하여 .c 또는 .h 파日만 検索 grep "api_key" --exclude-dir=node_modules -r . # --exclude-dir을 使用하여 특정 디렉토리(node_modules)를 検索에서 除外
AWK 명령어 심층 分석
awk는 패턴 検索과 テキスト/데이터 조작을 ための 강력한 프로그래밍 언어입니다. 週로 열(column) 기반의 데이터를 처리하고 보고서를 生成하는 데 탁月한 능력을 보입니다. C언어와 유사한 문법 구조를 가지며, 복잡한 조건 처리, 연산, 文字열 함수 등을 サポート합니다.AWK 프로그램의 기본 구조
pattern { action }- pattern: 어떤 라인에 대해
action을 수행할지 결정하는 조건입니다. 생략되면 모든 라인에 대해action이 수행됩니다.- 정규표현식:
/regex/ - 비교 표현식:
$1 == "ERROR",$3 > 100 - 文字열 매칭:
$2 ~ "pattern"(매칭),$2 !~ "pattern"(비매칭) - 특별한 패턴:
BEGIN,END
- 정규표현식:
- action: 중괄호
{}안에 기술되며, 歳미콜론(;)으로 구分된 하나 이상의awk명령어들로 구성됩니다. 생략되면 기본 동작은print $0(현재 라인 全体 出力)입니다.
특별 패턴:
BEGIN { actions }: 入力 파日을 읽기 전에 한 번 실행됩니다. 변수 リセット, 헤더 出力 등에 使用됩니다.END { actions }: 모든 入力 파日 처리가 끝난 후 한 번 실행됩니다. 총계 計算, 요약 보고서 出力 등에 使用됩니다.
필드 처리와 구分자
awk는 入力 라인을 **필드(field)**로 자동 分리합니다.$0: 현재 처리 중인 라인 全体를 나타냅니다.$1,$2,$3, ...: 첫 번째, 두 번째, 歳 번째 필드를 나타냅니다.- 필드 구分자 (Field Separator):
FS(Input Field Separator): 入力 필드 구分자입니다. デフォルト은 空白(스페이스, 탭)입니다.- 명령줄에서
-F옵션으로 지정:awk -F, '{print $1}' data.csv(쉼표로 구分된 CSV 파日) BEGIN블록에서 設定:awk 'BEGIN { FS = ":" } {print $1, $7}' /etc/passwd(콜론으로 구分된 파日)
- 명령줄에서
OFS(Output Field Separator): 出力 필드 구分자입니다. デフォルト은 空白입니다.BEGIN블록에서 設定:awk 'BEGIN { OFS = "\t" } {print $1, $2}' file.txt(탭으로 구分하여 出力)
# /etc/passwd 파日에서 使用자 이름(첫 번째 필드)과 셸(日곱 번째 필드) 出力, 콜론으로 구分 awk -F: '{print "User:", $1, "Shell:", $7}' /etc/passwd # CSV 파日에서 첫 번째와 歳 번째 필드를 탭으로 구分하여 出力 awk -F, 'BEGIN{OFS="\t"} {print $1, $3}' data.csv조건문과 패턴 상세
awk는 様々な 조건과 패턴을 使用하여 특정 라인에 대해서만 액션을 수행할 수 있습니다.정규표현식 패턴:
# 'error' 또는 'fail' (대小文字 무시) 文字열이 含む된 라인의 全体 内容 出力 /[Ee]rror|[Ff]ail/ {print $0}(쉘에서 실행 시)
awk '/[Ee]rror|[Ff]ail/ {print $0}' log.txt비교 표현식 패턴:
# 歳 번째 필드의 値이 100보다 큰 라인만 出力 $3 > 100 {print "Large Value Found:", $0}(쉘에서 실행 시)
awk '$3 > 100 {print "Large Value Found:", $0}' data.txt# 첫 번째 필드가 정확히 "user_admin"인 라인의 두 번째와 네 번째 필드 出力 $1 == "user_admin" {print $2, $4}(쉘에서 실행 시)
awk '$1 == "user_admin" {print $2, $4}' users.txt範囲 패턴: 특정 開始 패턴부터 특정 끝 패턴까지의 모든 라인에 대해 액션을 수행합니다.
# "START_SECTION" 라인부터 "END_SECTION" 라인까지 出力 /START_SECTION/,/END_SECTION/ {print}(쉘에서 실행 시)
awk '/START_SECTION/,/END_SECTION/ {print}' config.file논리 연산자:
&&(AND),||(OR),!(NOT)을 使用하여 복합적인 조건을 만들 수 있습니다.# 첫 번째 필드가 "admin"이고, 네 번째 필드가 0보다 큰 라인 出力 $1 == "admin" && $4 > 0 {print $0}(쉘에서 실행 시)
awk '$1 == "admin" && $4 > 0 {print $0}' access_records.txt액션 내의 조건문 (
if-else):{ if ($3 > 1000) { status = "High" } else if ($3 > 500) { status = "Medium" } else { status = "Low" } print $1, $2, $3, status }(쉘에서 실행 시)
awk '{ if ($3 > 1000) { status = "High" } else if ($3 > 500) { status = "Medium" } else { status = "Low" } print $1, $2, $3, status }' resource_usage.txt
週요 내장 변수
awk는 様々な 내장 변수를 제공하여 프로그래밍을 용이하게 합니다.변수명 説明 例 (쉘에서 실행 시) NRNumber of Records. 현재까지 처리한 총 레코드(라인)의 수. awk '{print NR, $0}' file.txt(라인 番号와 함께 出力)FNRFile Number of Record. 현재 처리 중인 파日 내에서의 레코드(라인) 수. 다중 파日 처리 시 유용. awk '{print FILENAME, FNR, $0}' file1.txt file2.txtNFNumber of Fields. 현재 레코드(라인)의 필드 개수. awk '{print "Line", NR, "has", NF, "fields:", $0}' file.txtFILENAME현재 처리 중인 入力 파日의 이름. awk '/error/ {print FILENAME, ":", $0}' *.logFSInput Field Separator. 入力 필드 구分자 (デフォルト: 空白). awk -F';' '{print $1}' data.csv<br>awk 'BEGIN{FS=";"} {print $1}' data.csvOFSOutput Field Separator. 出力 필드 구分자 (デフォルト: 空白). awk 'BEGIN{OFS=","} {print $1, $2}' file.txt(쉼표로 구分하여 出力)RSRecord Separator. 入力 레코드 구分자 (デフォルト: 개행 文字 \n).awk 'BEGIN{RS="\n\n"} {print $1}' paragraphs.txt(빈 줄로 구分된 단락 처리)ORSOutput Record Separator. 出力 레코드 구分자 (デフォルト: 개행 文字 \n).awk 'BEGIN{ORS=";"} {print $1}' items.txt(세미콜론으로 레코드 구分 出力)ARGCArgument Count. 명령줄 인수의 개수. awk 'BEGIN{print "ARGC:", ARGC}' file.txtARGVArgument Vector. 명령줄 인수를 담고 있는 배열. ARGV[0]은awk자체.awk 'BEGIN{for(i=0;i<ARGC;i++) print ARGV[i]}' file.txtENVIRON환경 변수에 접근할 수 있는 연관 배열. awk 'BEGIN{print "User:", ENVIRON["USER"]}'AWK 스크립팅: 변수, 배열, 루프
awk는 단순한 フィルタリング을 넘어 스크립팅 언어로서의 機能도 提供します.변수 使用:
# 歳 번째 필드의 합계 計算 { sum += $3 } END { print "Total Sum:", sum }(쉘에서 실행 시)
awk '{ sum += $3 } END { print "Total Sum:", sum }' numbers.txt연관 배열 (Associative Arrays):
awk의 배열은 数字 인덱스뿐만 아니라 文字열 인덱스도 使用할 수 있습니다.# 첫 번째 필드(はい: IPアドレス)의 등장 횟수 計算 { counts[$1]++ } END { for (ip in counts) print ip, "occurred", counts[ip], "times" }(쉘에서 실행 시)
awk '{ counts[$1]++ } END { for (ip in counts) print ip, "occurred", counts[ip], "times" }' access.log루프 (Loops):
for루프와while루프를 使用할 수 있습니다.# 각 라인의 모든 필드를 역순으로 出力 { for (i = NF; i >= 1; i--) { printf "%s ", $i } printf "\n" # 또는 print "" }(쉘에서 실행 시)
awk '{ for (i = NF; i >= 1; i--) { printf "%s ", $i } printf "\n" # 또는 print "" }' data.txt# 1부터 5까지 数字 出力 (BEGIN 블록에서) BEGIN { i=1; while(i<=5) { print i; i++ } }(쉘에서 실행 시)
awk 'BEGIN { i=1; while(i<=5) { print i; i++ } }'使用자 정의 함수 (User-Defined Functions):
function format_size(bytes, suffix_idx, suffixes) { # 로컬 변수는 追加 파라미터로 선언 suffixes = "Bytes KB MB GB TB PB" split(suffixes, suffix_array, " ") suffix_idx = 1 while (bytes >= 1024 && suffix_idx < length(suffix_array)) { bytes /= 1024 suffix_idx++ } return sprintf("%.2f %s", bytes, suffix_array[suffix_idx]) } # 파日 サイズ(ls -l의 5번째 필드)를 읽기 簡単に 포맷팅 (NR > 1은 헤더 除外) # 쉘에서 실행하는 例 # ls -l | awk ' # function format_size(bytes, suffix_idx, suffixes) { # suffixes = "Bytes KB MB GB TB PB"; split(suffixes, suffix_array, " "); suffix_idx = 1 # while (bytes >= 1024 && suffix_idx < length(suffix_array)) { bytes /= 1024; suffix_idx++ } # return sprintf("%.2f %s", bytes, suffix_array[suffix_idx]) # } # NR > 1 {print $9, format_size($5)}'(위
ls -l例를 쉘에서 바로 실행할 수 있는 형태로 아래에 제공)ls -l | awk ' function format_size(bytes, suffix_idx, suffixes) { # 로컬 변수는 追加 파라미터로 선언하는 것이 좋은 습관입니다. # suffixes와 suffix_idx를 파라미터로 선언하여 로컬 변수처럼 使用합니다. # 실제 値은 함수 호출 시 전달하지 않아도 됩니다. suffixes = "Bytes KB MB GB TB PB" split(suffixes, suffix_array, " ") suffix_idx = 1 while (bytes >= 1024 && suffix_idx < length(suffix_array)) { bytes /= 1024 suffix_idx++ } return sprintf("%.2f %s", bytes, suffix_array[suffix_idx]) } NR > 1 {print $9, format_size($5)}'
실무 활용 例 심층 分석
시스템 모니터링
메모리 使用량이 특정 임계値(はい: 5.0%)을 秒과하는 프로세스 探す (프로세스 ID, 메모리 使用률, 명령어 出力):
ps aux | awk 'NR > 1 && $4 > 5.0 {printf "PID: %s, %%MEM: %s, CMD: %s\n", $2, $4, $11}' # NR > 1 : 헤더 라인 除外 # $4 > 5.0 : 4번째 필드(메모리 使用률)가 5.0보다 큰 경우 # printf : 형식화된 出力디스크 使用량이 90% 이상인 파티션 探す (파日 시스템, 使用률, 마운트 지점 出力):
df -h | awk 'NR > 1 && int($5) > 90 {print "FS:", $1, "| Usage:", $5, "| Mounted on:", $6}' # int($5) : % 기호를 제거하고 정수형으로 変換 (GNU awk에서는 $5+0 으로도 可能) # df -P | awk 'NR > 1 && $5+0 > 90 {print $1, $5, $6}' # POSIX 호환, % 자동 제거특정 포트(はい: 80)를 使用하는 ネットワーク 연결 상태 보기:
netstat -tulnp | grep ":80\s" | awk '{print $4, $5, $7}' # $4: Local Address, $5: Foreign Address, $7: PID/Program name
로그 分석
ウェブ 서버 로그(common log format)에서 특정 時間대(はい: 10시부터 11시 사이)의 404 에러 로그 추출 및 요청 경로 出力:
# はい: 20/Jul/2025:10:00:00 부터 20/Jul/2025:10:59:59 까지 grep "20/Jul/2025:10:" access.log | awk '$9 == "404" {print $1, $4, $7, $9}' # $1: IP, $4: Timestamp, $7: Requested Path, $9: Status CodeIPアドレス별 접속 횟수 計算 및 상위 10개 IP 出力:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10 # awk '{print $1}' : 첫 번째 필드(IPアドレス)만 추출 # sort : IPアドレス 整列 # uniq -c : 중복 제거 및 횟수 카운트 # sort -nr : 数字 기준 내림차순 整列 (가장 많은 접속부터) # head -n 10 : 상위 10개만 出力AWK 만으로도 可能:
awk '{ip_counts[$1]++} END {for (ip in ip_counts) print ip_counts[ip], ip}' access.log | sort -nr | head -n 10SSH 로그인 失敗 로그에서 시도된 使用자 이름과 IPアドレス 추출:
grep "Failed password" /var/log/auth.log | awk '{print "User:", $(NF-5), "IP:", $(NF-3)}' # "Failed password for invalid user admin from 1.2.3.4 port 12345 ssh2" 같은 로그 형식 가정 # $(NF-5) : 뒤에서 6번째 필드 (使用자 이름) # $(NF-3) : 뒤에서 4번째 필드 (IPアドレス) # 로그 형식에 따라 필드 番号는 달라질 수 あり. # 例: "Failed password for root from 116.37.102.13 port 40940 ssh2" # 이 경우 awk '{print "User:", $9, "IP:", $11}'
데이터 처리 및 変換
CSV 파日에서 특정 조건(はい: 3번째 열의 値이 "Completed")을 만족하는 행의 1번째와 5번째 열을 새로운 CSV 파日로 保存:
awk -F, '$3 == "Completed" {print $1 "," $5}' input.csv > output.csv또는 OFS 使用:
awk -F, 'BEGIN{OFS=","} $3 == "Completed" {print $1, $5}' input.csv > output.csvテキスト 파日에서 모든 メール アドレス를 추출하여 한 줄에 하나씩 整列 및 중복 제거:
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt | sort | uniq # grep -o : 日치하는 부分만 出力 # \b : 단어 경계 # [A-Za-z0-9._%+-]+ : 使用자 이름 부分 # @ : 구分자 # [A-Za-z0-9.-]+ : 도메인 이름 부分 # \.[A-Za-z]{2,6} : 최상위 도메인 부分 (はい: .com, .co.kr)数字 리스트 파日에서 각 数字를 제곱하여 出力:
# numbers.txt 内容 例: # 1 # 5 # 10awk '{print $1, "squared is", $1*$1}' numbers.txt出力:
# 1 squared is 1 # 5 squared is 25 # 10 squared is 100여러 파日의 특정 열 합계 計算 (はい: 각 파日의 2번째 열 합계 및 총합):
# data1.txt: # itemA 10 # itemB 20 # data2.txt: # itemC 30 # itemD 40GNU Awk 확장 使用 시:
awk ' { current_sum += $2 } ENDFILE { # GNU Awk 확장. 각 파日 처리 후 실행 print "Sum for", FILENAME, ":", current_sum total_sum += current_sum current_sum = 0 # 次へ 파日을 위해 リセット } END { print "Grand Total:", total_sum } ' data*.txtPOSIX 호환 (FNR 使用):
awk ' FNR == 1 && NR != 1 { # 새 파日 開始 (첫 파日 除外) print "Sum for", prev_filename, ":", current_sum total_sum += current_sum current_sum = 0 } { current_sum += $2; prev_filename = FILENAME } END { print "Sum for", prev_filename, ":", current_sum # 最後 파日 합계 total_sum += current_sum print "Grand Total:", total_sum } ' data*.txt
Grep과 AWK의 조합
grep으로 1차 フィルタリング을 하고, 그 結果를 파이프(|)를 を通じてawk로 넘겨 2차 가공하는 방식은 매우 효과적입니다.# /var/log/secure 에서 "Accepted publickey" 로그 중 使用자명과 IPアドレス만 추출 grep "Accepted publickey" /var/log/secure | awk '{print "User:", $9, "IP:", $11, "Port:", $13}' # 현재 디렉토리의 C 소스 파日(*.c)들 중에서 "include" 라는 단어를 含む하는 라인을 찾고, # 그 라인들에서 파日명과 라인番号, 그리고 #include 뒤의 헤더 파日 이름만 추출 grep -Hn "include" *.c | awk -F'[:<>]' '{print "File: " $1 ", Line: " $2 ", Header: " $4}' # grep -H: 파日명 出力, -n: 라인番号 出力 # awk -F'[:<>]': 콜론(:), 여는 꺽쇠(<), 닫는 꺽쇠(>)를 구分자로 使用 # はい: main.c:10:#include <stdio.h> -> $1=main.c, $2=10, $3=#include , $4=stdio.h결론
grep과awk는 리눅스/유닉스 환경에서 テキスト를 다루는 데 있어 스위스 군용 칼과 같은 존재입니다.grep은 강력한 패턴 検索 능력으로 원하는 情報를 速く 찾아내고,awk는 구조화된 데이터 처리와 리포팅에 특화되어 있습니다. 이 두 ツール의 様々な 옵션과 정규표현식, 그리고awk의 프로그래밍 機能을 깊이 이해하고 조합하여 使用한다면, 복잡하고 방대한 テキスト 데이터도 손簡単に 원하는 형태로 가공하고 分석할 수 있습니다.물론 매우 복잡한 로직이나 대규모 데이터 처리에는 Python, Perl과 같은 범용 스크립팅 언어가 더 적합할 수 있지만, 대부分의 日상적인 시스템 관리, 로그 分석, 간단한 데이터 変換 작업은
grep과awk만으로도 충分히 효율적으로 처리할 수 있습니다. 꾸준한 연습과 様々な 실제 문제에 적용해보는 것이 이 ツール들을 마스터하는 가장 좋은 방법입니다.