리눅스 Grep과 AWK Use 가이드
Linux Grep and AWK Usage Guide
리눅스 Text 처리 심층 Minutes석: Grep과 AWK 마스터하기
리눅스 및 유닉스 계열 시스템에서 Text 데이터는 운영의 핵심입니다. 로그 파Day, Settings 파Day, 명령어 Output 등 모든 것이 Text 형태로 존재하며, 이를 효과적으로 다루는 능력은 시스템 관리자, 개발자, 데이터 Minutes석가 All에게 Required적입니다. 이 글에서는 리눅스에서 가장 강력하고 널리 Use되는 Text 처리 Tool인 grep과 awk의 기본 Use법부터 고급 활용법까지 상세하게 알아봅니다. 이 두 Tool를 능숙하게 Use하면 복잡한 Text 처리 작업을 자동화하고, 방대한 데이터에서 원하는 Info를 신속하게 추출하며, 시스템 모니터링 및 Minutes석 작업을 효율적으로 수행할 수 있습니다.
Grep (Global Regular Expression Print) 명령어 심층 Minutes석
grep은 파Day이나 표준 Input으로부터 특정 패턴(Week로 정규표현식)과 Day치하는 라인을 찾아 Output하는 강력한 명령줄 Utility입니다. 단순한 Characters열 Search부터 복잡한 패턴 매칭까지 Various Feature을 provides.
기본 Use법
grep [옵션] 패턴 [파Day...]
[옵션]: Search 방식을 제어하는 Various 옵션들입니다.패턴: Search할 Characters열 또는 정규표현식입니다.[파Day...]: Search 대상 파Day입니다. 생략 시 표준 Input(stdin)을 Use합니다.
Frequently Used하고 유용한 옵션 상세
| 옵션 | Description | Example |
|---|---|---|
-i (--ignore-case) |
대Lowercase를 구Minutes하지 않고 Search합니다. | grep -i "error" log.txt |
-n (--line-number) |
Day치하는 라인의 Number를 함께 Output합니다. | grep -n "warning" log.txt |
-v (--invert-match) |
패턴과 Day치하지 않는 라인만 Search합니다. | grep -v "success" log.txt |
-c (--count) |
패턴과 Day치하는 라인의 총 개수만 Output합니다. | grep -c "debug" app.log |
-l (--files-with-matches) |
패턴과 Day치하는 라인이 Include된 파Day의 이름만 Output합니다. (Content은 Output 안 함) | grep -l "TODO" *.java |
-L (--files-without-match) |
패턴과 Day치하는 라인이 없는 파Day의 이름만 Output합니다. | grep -L "FINAL_VERSION" *.txt |
-r 또는 -R (--recursive) |
지정된 디렉토리와 그 하위 디렉토리까지 재귀적으로 Search합니다. | grep -r "config_value" /etc/project/ |
-w (--word-regexp) |
패턴이 독립된 단어(word)로 Day치하는 경우만 Search합니다. (Spaces이나 Special Characters로 구Minutes) | grep -w "main" program.c (main_function은 매칭, print_main은 불Day치) |
-x (--line-regexp) |
패턴이 라인 All와 정확히 Day치하는 경우만 Search합니다. | grep -x "localhost:8080" access.log |
-E (--extended-regexp) |
확장 정규표현식(ERE)을 Use합니다. egrep 명령어와 동Day합니다. |
`grep -E "error |
-F (--fixed-strings) |
패턴을 정규표현식이 아닌 고정된 Characters열로 취급합니다. (Special Characters도 Day반Characters로) | grep -F "*ERROR*" log.txt (*를 Characters 그대로 Search) |
-A NUM (--after-context=NUM) |
Day치하는 라인과 그 이후 NUM개의 라인을 함께 Output합니다. |
grep -A 2 "Exception" error.log |
-B NUM (--before-context=NUM) |
Day치하는 라인과 그 Previous NUM개의 라인을 함께 Output합니다. |
grep -B 3 "SEGFAULT" core_dump.txt |
-C NUM (--context=NUM) |
Day치하는 라인과 그 Previous/이후 NUM개의 라인을 함께 Output합니다. (-A NUM -B NUM과 유사) |
grep -C 1 "critical error" system.log |
--color=auto |
Search된 패턴을 다른 색으로 강조하여 보여줍니다. (대부Minutes 시스템에서 Default) | grep --color=auto "pattern" file.txt |
-o (--only-matching) |
Day치하는 라인 All가 아닌, 패턴과 Day치하는 부Minutes만 Output합니다. 각 매칭은 새 줄에 표시. | 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의 진정한 강력함은 정규표현식과 함께 Use할 때 발휘됩니다. 정규표현식은 Text의 특정 패턴을 기술하는 형식 언어입니다.
- 기본 정규표현식 (BRE - Basic Regular Expressions):
grep의 기본 모드입니다.*,.,^,$,[],\등의 메타Characters를 Use합니다.+,?,|,()같은 Some 메타Characters는 앞에\를 붙여야 특별한 의미로 Use됩니다 (Yes:\+,\?,\|,\(\)). - 확장 정규표현식 (ERE - Extended Regular Expressions):
grep -E또는egrep을 Use합니다. BRE의 모든 Feature에 더해+,?,|,()등을\없이 Use할 수 있어 표현이 간결해집니다.
Week요 정규표현식 메타Characters 및 구성 요소:
| 메타Characters/구성요소 | Description | BRE Example (필요시 \) |
ERE Example (grep -E) |
|---|---|---|---|
. |
임의의 한 Characters와 Day치 (줄바꿈 Characters Exclude) | a.c |
a.c |
* |
바로 앞의 Characters가 0번 이상 반복될 때 Day치 | ab*c (ac, abc, abbc...) |
ab*c |
+ |
바로 앞의 Characters가 1번 이상 반복될 때 Day치 (ERE) | ab\+c |
ab+c (abc, abbc...) |
? |
바로 앞의 Characters가 0번 또는 1번 나타날 때 Day치 (ERE) | ab\?c |
ab?c (ac, abc) |
^ |
라인의 Start 부Minutes과 Day치 | ^start |
^start |
$ |
라인의 끝 부Minutes과 Day치 | end$ |
end$ |
[abc] |
대괄호 안의 Characters 중 하나와 Day치 (a 또는 b 또는 c) | [aeiou] |
[aeiou] |
[^abc] |
대괄호 안의 Characters를 Exclude한 나머지 Characters 중 하나와 Day치 | [^0-9] (Numbers Exclude) |
[^0-9] |
[a-z] |
a부터 z까지의 Characters 중 하나와 Day치 (Range 지정) | [A-Za-z0-9] |
[A-Za-z0-9] |
| (BRE) | (ERE) |
OR 조건. 앞 또는 뒤의 패턴 중 하나와 Day치 | apple|orange |
`apple |
\(...\) (BRE) (...) (ERE) |
그룹화. 패턴의 Some를 묶어 적용 Range를 지정하거나, 역참조를 위해 Use | \(ab\)\+ |
(ab)+ |
{n} |
바로 앞의 Characters가 정확히 n번 반복 (ERE) | a\{3\} |
a{3} (aaa) |
{n} |
바로 앞의 Characters가 n번 이상 반복 (ERE) | a\{2,\} |
a{2} (aa, aaa...) |
{n,m} |
바로 앞의 Characters가 n번 이상 m번 이하 반복 (ERE) | a\{2,4\} |
a{2,4} (aa, aaa, aaaa) |
\b |
단어 경계 (word boundary). 단어의 Start이나 끝을 의미 (GNU grep) | \bword\b |
\bword\b |
\w |
단어 Characters (알파벳, Numbers, 밑줄). [A-Za-z0-9_]와 유사 (GNU grep) |
\w+ |
\w+ |
\s |
Spaces Characters (스페이스, 탭 등) (GNU grep) | \s* |
\s* |
실제 활용 Example 확장
로그 파Day에서 특정 Date의 에러 메시지만 추출:
# 2025Year 7Month 20Day에 발생한 ERROR 메시지 Search grep "2025-07-20" /var/log/syslog | grep "ERROR" # 또는 정규표현식을 Use하여 한 번에 Search (ERE Use) grep -E "^2025-07-20.*ERROR" /var/log/syslog특정 Use자(Yes: 'nginx')의 프로세스 찾고 CPU/메모리 Use량 Check:
ps aux | grep "^nginx" # nginx로 Start하는 Use자명의 프로세스 # ps aux의 Output에서 첫 번째 필드가 'nginx'인 라인만 grep ps aux | grep -E "^nginx\s+"Settings 파Day에서 Week석(#으로 Start) 및 빈 라인을 Exclude한 실제 SettingsValue만 보기:
grep -v -E "^\s*#|^\s*리눅스 Text 처리 심층 Minutes석: Grep과 AWK 마스터하기
리눅스 및 유닉스 계열 시스템에서 Text 데이터는 운영의 핵심입니다. 로그 파Day, Settings 파Day, 명령어 Output 등 모든 것이 Text 형태로 존재하며, 이를 효과적으로 다루는 능력은 시스템 관리자, 개발자, 데이터 Minutes석가 All에게 Required적입니다. 이 글에서는 리눅스에서 가장 강력하고 널리 Use되는 Text 처리 Tool인 grep과 awk의 기본 Use법부터 고급 활용법까지 상세하게 알아봅니다. 이 두 Tool를 능숙하게 Use하면 복잡한 Text 처리 작업을 자동화하고, 방대한 데이터에서 원하는 Info를 신속하게 추출하며, 시스템 모니터링 및 Minutes석 작업을 효율적으로 수행할 수 있습니다.
Grep (Global Regular Expression Print) 명령어 심층 Minutes석
grep은 파Day이나 표준 Input으로부터 특정 패턴(Week로 정규표현식)과 Day치하는 라인을 찾아 Output하는 강력한 명령줄 Utility입니다. 단순한 Characters열 Search부터 복잡한 패턴 매칭까지 Various Feature을 provides.기본 Use법
grep [옵션] 패턴 [파Day...][옵션]: Search 방식을 제어하는 Various 옵션들입니다.패턴: Search할 Characters열 또는 정규표현식입니다.[파Day...]: Search 대상 파Day입니다. 생략 시 표준 Input(stdin)을 Use합니다.
Frequently Used하고 유용한 옵션 상세
옵션 Description Example -i(--ignore-case)대Lowercase를 구Minutes하지 않고 Search합니다. grep -i "error" log.txt-n(--line-number)Day치하는 라인의 Number를 함께 Output합니다. grep -n "warning" log.txt-v(--invert-match)패턴과 Day치하지 않는 라인만 Search합니다. grep -v "success" log.txt-c(--count)패턴과 Day치하는 라인의 총 개수만 Output합니다. grep -c "debug" app.log-l(--files-with-matches)패턴과 Day치하는 라인이 Include된 파Day의 이름만 Output합니다. (Content은 Output 안 함) grep -l "TODO" *.java-L(--files-without-match)패턴과 Day치하는 라인이 없는 파Day의 이름만 Output합니다. grep -L "FINAL_VERSION" *.txt-r또는-R(--recursive)지정된 디렉토리와 그 하위 디렉토리까지 재귀적으로 Search합니다. grep -r "config_value" /etc/project/-w(--word-regexp)패턴이 독립된 단어(word)로 Day치하는 경우만 Search합니다. (Spaces이나 Special Characters로 구Minutes) grep -w "main" program.c(main_function은 매칭, print_main은 불Day치)-x(--line-regexp)패턴이 라인 All와 정확히 Day치하는 경우만 Search합니다. grep -x "localhost:8080" access.log-E(--extended-regexp)확장 정규표현식(ERE)을 Use합니다. egrep명령어와 동Day합니다.`grep -E "error -F(--fixed-strings)패턴을 정규표현식이 아닌 고정된 Characters열로 취급합니다. (Special Characters도 Day반Characters로) grep -F "*ERROR*" log.txt(*를 Characters 그대로 Search)-A NUM(--after-context=NUM)Day치하는 라인과 그 이후 NUM개의 라인을 함께 Output합니다.grep -A 2 "Exception" error.log-B NUM(--before-context=NUM)Day치하는 라인과 그 Previous NUM개의 라인을 함께 Output합니다.grep -B 3 "SEGFAULT" core_dump.txt-C NUM(--context=NUM)Day치하는 라인과 그 Previous/이후 NUM개의 라인을 함께 Output합니다. (-A NUM -B NUM과 유사)grep -C 1 "critical error" system.log--color=autoSearch된 패턴을 다른 색으로 강조하여 보여줍니다. (대부Minutes 시스템에서 Default) grep --color=auto "pattern" file.txt-o(--only-matching)Day치하는 라인 All가 아닌, 패턴과 Day치하는 부Minutes만 Output합니다. 각 매칭은 새 줄에 표시. grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.logGrep과 정규표현식 (Regular Expressions)
grep의 진정한 강력함은 정규표현식과 함께 Use할 때 발휘됩니다. 정규표현식은 Text의 특정 패턴을 기술하는 형식 언어입니다.- 기본 정규표현식 (BRE - Basic Regular Expressions):
grep의 기본 모드입니다.*,.,^,$,[],\등의 메타Characters를 Use합니다.+,?,|,()같은 Some 메타Characters는 앞에\를 붙여야 특별한 의미로 Use됩니다 (Yes:\+,\?,\|,\(\)). - 확장 정규표현식 (ERE - Extended Regular Expressions):
grep -E또는egrep을 Use합니다. BRE의 모든 Feature에 더해+,?,|,()등을\없이 Use할 수 있어 표현이 간결해집니다.
Week요 정규표현식 메타Characters 및 구성 요소:
메타Characters/구성요소 Description BRE Example (필요시 \)ERE Example ( grep -E).임의의 한 Characters와 Day치 (줄바꿈 Characters Exclude) a.ca.c*바로 앞의 Characters가 0번 이상 반복될 때 Day치 ab*c(ac, abc, abbc...)ab*c+바로 앞의 Characters가 1번 이상 반복될 때 Day치 (ERE) ab\+cab+c(abc, abbc...)?바로 앞의 Characters가 0번 또는 1번 나타날 때 Day치 (ERE) ab\?cab?c(ac, abc)^라인의 Start 부Minutes과 Day치 ^start^start$라인의 끝 부Minutes과 Day치 end$end$[abc]대괄호 안의 Characters 중 하나와 Day치 (a 또는 b 또는 c) [aeiou][aeiou][^abc]대괄호 안의 Characters를 Exclude한 나머지 Characters 중 하나와 Day치 [^0-9](Numbers Exclude)[^0-9][a-z]a부터 z까지의 Characters 중 하나와 Day치 (Range 지정) [A-Za-z0-9][A-Za-z0-9]|(BRE)|(ERE)OR 조건. 앞 또는 뒤의 패턴 중 하나와 Day치 apple|orange`apple \(...\)(BRE)(...)(ERE)그룹화. 패턴의 Some를 묶어 적용 Range를 지정하거나, 역참조를 위해 Use \(ab\)\+(ab)+{n}바로 앞의 Characters가 정확히 n번 반복 (ERE) a\{3\}a{3}(aaa){n}바로 앞의 Characters가 n번 이상 반복 (ERE) a\{2,\}a{2}(aa, aaa...){n,m}바로 앞의 Characters가 n번 이상 m번 이하 반복 (ERE) a\{2,4\}a{2,4}(aa, aaa, aaaa)\b단어 경계 (word boundary). 단어의 Start이나 끝을 의미 (GNU grep) \bword\b\bword\b\w단어 Characters (알파벳, Numbers, 밑줄). [A-Za-z0-9_]와 유사 (GNU grep)\w+\w+\sSpaces Characters (스페이스, 탭 등) (GNU grep) \s*\s*실제 활용 Example 확장
로그 파Day에서 특정 Date의 에러 메시지만 추출:
# 2025Year 7Month 20Day에 발생한 ERROR 메시지 Search grep "2025-07-20" /var/log/syslog | grep "ERROR" # 또는 정규표현식을 Use하여 한 번에 Search (ERE Use) grep -E "^2025-07-20.*ERROR" /var/log/syslog특정 Use자(Yes: 'nginx')의 프로세스 찾고 CPU/메모리 Use량 Check:
ps aux | grep "^nginx" # nginx로 Start하는 Use자명의 프로세스 # ps aux의 Output에서 첫 번째 필드가 'nginx'인 라인만 grep ps aux | grep -E "^nginx\s+"Settings 파Day에서 Week석(#으로 Start) 및 빈 라인을 Exclude한 실제 SettingsValue만 보기:
grep -v -E "^\s*#|^\s*리눅스 Text 처리 심층 Minutes석: Grep과 AWK 마스터하기
리눅스 및 유닉스 계열 시스템에서 Text 데이터는 운영의 핵심입니다. 로그 파Day, Settings 파Day, 명령어 Output 등 모든 것이 Text 형태로 존재하며, 이를 효과적으로 다루는 능력은 시스템 관리자, 개발자, 데이터 Minutes석가 All에게 Required적입니다. 이 글에서는 리눅스에서 가장 강력하고 널리 Use되는 Text 처리 Tool인 grep과 awk의 기본 Use법부터 고급 활용법까지 상세하게 알아봅니다. 이 두 Tool를 능숙하게 Use하면 복잡한 Text 처리 작업을 자동화하고, 방대한 데이터에서 원하는 Info를 신속하게 추출하며, 시스템 모니터링 및 Minutes석 작업을 효율적으로 수행할 수 있습니다.
Grep (Global Regular Expression Print) 명령어 심층 Minutes석
grep은 파Day이나 표준 Input으로부터 특정 패턴(Week로 정규표현식)과 Day치하는 라인을 찾아 Output하는 강력한 명령줄 Utility입니다. 단순한 Characters열 Search부터 복잡한 패턴 매칭까지 Various Feature을 provides.기본 Use법
grep [옵션] 패턴 [파Day...][옵션]: Search 방식을 제어하는 Various 옵션들입니다.패턴: Search할 Characters열 또는 정규표현식입니다.[파Day...]: Search 대상 파Day입니다. 생략 시 표준 Input(stdin)을 Use합니다.
Frequently Used하고 유용한 옵션 상세
옵션 Description Example -i(--ignore-case)대Lowercase를 구Minutes하지 않고 Search합니다. grep -i "error" log.txt-n(--line-number)Day치하는 라인의 Number를 함께 Output합니다. grep -n "warning" log.txt-v(--invert-match)패턴과 Day치하지 않는 라인만 Search합니다. grep -v "success" log.txt-c(--count)패턴과 Day치하는 라인의 총 개수만 Output합니다. grep -c "debug" app.log-l(--files-with-matches)패턴과 Day치하는 라인이 Include된 파Day의 이름만 Output합니다. (Content은 Output 안 함) grep -l "TODO" *.java-L(--files-without-match)패턴과 Day치하는 라인이 없는 파Day의 이름만 Output합니다. grep -L "FINAL_VERSION" *.txt-r또는-R(--recursive)지정된 디렉토리와 그 하위 디렉토리까지 재귀적으로 Search합니다. grep -r "config_value" /etc/project/-w(--word-regexp)패턴이 독립된 단어(word)로 Day치하는 경우만 Search합니다. (Spaces이나 Special Characters로 구Minutes) grep -w "main" program.c(main_function은 매칭, print_main은 불Day치)-x(--line-regexp)패턴이 라인 All와 정확히 Day치하는 경우만 Search합니다. grep -x "localhost:8080" access.log-E(--extended-regexp)확장 정규표현식(ERE)을 Use합니다. egrep명령어와 동Day합니다.`grep -E "error -F(--fixed-strings)패턴을 정규표현식이 아닌 고정된 Characters열로 취급합니다. (Special Characters도 Day반Characters로) grep -F "*ERROR*" log.txt(*를 Characters 그대로 Search)-A NUM(--after-context=NUM)Day치하는 라인과 그 이후 NUM개의 라인을 함께 Output합니다.grep -A 2 "Exception" error.log-B NUM(--before-context=NUM)Day치하는 라인과 그 Previous NUM개의 라인을 함께 Output합니다.grep -B 3 "SEGFAULT" core_dump.txt-C NUM(--context=NUM)Day치하는 라인과 그 Previous/이후 NUM개의 라인을 함께 Output합니다. (-A NUM -B NUM과 유사)grep -C 1 "critical error" system.log--color=autoSearch된 패턴을 다른 색으로 강조하여 보여줍니다. (대부Minutes 시스템에서 Default) grep --color=auto "pattern" file.txt-o(--only-matching)Day치하는 라인 All가 아닌, 패턴과 Day치하는 부Minutes만 Output합니다. 각 매칭은 새 줄에 표시. grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.logGrep과 정규표현식 (Regular Expressions)
grep의 진정한 강력함은 정규표현식과 함께 Use할 때 발휘됩니다. 정규표현식은 Text의 특정 패턴을 기술하는 형식 언어입니다.- 기본 정규표현식 (BRE - Basic Regular Expressions):
grep의 기본 모드입니다.*,.,^,$,[],\등의 메타Characters를 Use합니다.+,?,|,()같은 Some 메타Characters는 앞에\를 붙여야 특별한 의미로 Use됩니다 (Yes:\+,\?,\|,\(\)). - 확장 정규표현식 (ERE - Extended Regular Expressions):
grep -E또는egrep을 Use합니다. BRE의 모든 Feature에 더해+,?,|,()등을\없이 Use할 수 있어 표현이 간결해집니다.
Week요 정규표현식 메타Characters 및 구성 요소:
메타Characters/구성요소 Description BRE Example (필요시 \)ERE Example ( grep -E).임의의 한 Characters와 Day치 (줄바꿈 Characters Exclude) a.ca.c*바로 앞의 Characters가 0번 이상 반복될 때 Day치 ab*c(ac, abc, abbc...)ab*c+바로 앞의 Characters가 1번 이상 반복될 때 Day치 (ERE) ab\+cab+c(abc, abbc...)?바로 앞의 Characters가 0번 또는 1번 나타날 때 Day치 (ERE) ab\?cab?c(ac, abc)^라인의 Start 부Minutes과 Day치 ^start^start$라인의 끝 부Minutes과 Day치 end$end$[abc]대괄호 안의 Characters 중 하나와 Day치 (a 또는 b 또는 c) [aeiou][aeiou][^abc]대괄호 안의 Characters를 Exclude한 나머지 Characters 중 하나와 Day치 [^0-9](Numbers Exclude)[^0-9][a-z]a부터 z까지의 Characters 중 하나와 Day치 (Range 지정) [A-Za-z0-9][A-Za-z0-9]|(BRE)|(ERE)OR 조건. 앞 또는 뒤의 패턴 중 하나와 Day치 apple|orange`apple \(...\)(BRE)(...)(ERE)그룹화. 패턴의 Some를 묶어 적용 Range를 지정하거나, 역참조를 위해 Use \(ab\)\+(ab)+{n}바로 앞의 Characters가 정확히 n번 반복 (ERE) a\{3\}a{3}(aaa){n}바로 앞의 Characters가 n번 이상 반복 (ERE) a\{2,\}a{2}(aa, aaa...){n,m}바로 앞의 Characters가 n번 이상 m번 이하 반복 (ERE) a\{2,4\}a{2,4}(aa, aaa, aaaa)\b단어 경계 (word boundary). 단어의 Start이나 끝을 의미 (GNU grep) \bword\b\bword\b\w단어 Characters (알파벳, Numbers, 밑줄). [A-Za-z0-9_]와 유사 (GNU grep)\w+\w+\sSpaces Characters (스페이스, 탭 등) (GNU grep) \s*\s*실제 활용 Example 확장
로그 파Day에서 특정 Date의 에러 메시지만 추출:
# 2025Year 7Month 20Day에 발생한 ERROR 메시지 Search grep "2025-07-20" /var/log/syslog | grep "ERROR" # 또는 정규표현식을 Use하여 한 번에 Search (ERE Use) grep -E "^2025-07-20.*ERROR" /var/log/syslog특정 Use자(Yes: 'nginx')의 프로세스 찾고 CPU/메모리 Use량 Check:
ps aux | grep "^nginx" # nginx로 Start하는 Use자명의 프로세스 # ps aux의 Output에서 첫 번째 필드가 'nginx'인 라인만 grep ps aux | grep -E "^nginx\s+"Settings 파Day에서 Week석(#으로 Start) 및 빈 라인을 Exclude한 실제 SettingsValue만 보기:
grep -v -E "^\s*#|^\s*$" /etc/ssh/sshd_config # ^\s*# : Spaces으로 Start할 수도 있는 Week석 라인 # ^\s*$ : Spaces만 있거나 아무것도 없는 빈 라인 # | : OR 조건 # -v : 위 패턴들을 Exclude소스 코드에서 함수 정의 Find (Yes: 'function_name(' 패턴):
grep -E -n -r "my_function\s*\(" ./src_directory/ # -n: 라인 Number 표시, -r: 하위 디렉토리 Search # \s*\( : 함수 이름 뒤에 Spaces이 있거나 없을 수 있고, 여는 괄호가 오는 패턴IP Address만 추출하기:
grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log # -o: Day치하는 부Minutes만 Output # ([0-9]{1,3}\.){3} : 1~3자리 Numbers와 점(.)이 3번 반복 (Yes: 192.168.1.) # [0-9]{1,3} : Last 1~3자리 Numbers (Yes: 100)특정 확장자를 가진 파Day에서만 Search:
grep "search_term" --include=\*.{c,h} -r ./project_dir/ # --include를 Use하여 .c 또는 .h 파Day만 Search grep "api_key" --exclude-dir=node_modules -r . # --exclude-dir을 Use하여 특정 디렉토리(node_modules)를 Search에서 Exclude
AWK 명령어 심층 Minutes석
awk는 패턴 Search과 Text/데이터 조작을 for 강력한 프로그래밍 언어입니다. Week로 열(column) 기반의 데이터를 처리하고 보고서를 Generate하는 데 탁Month한 능력을 보입니다. C언어와 유사한 문법 구조를 가지며, 복잡한 조건 처리, 연산, Characters열 함수 등을 Support합니다.AWK 프로그램의 기본 구조
pattern { action }- pattern: 어떤 라인에 대해
action을 수행할지 결정하는 조건입니다. 생략되면 모든 라인에 대해action이 수행됩니다.- 정규표현식:
/regex/ - 비교 표현식:
$1 == "ERROR",$3 > 100 - Characters열 매칭:
$2 ~ "pattern"(매칭),$2 !~ "pattern"(비매칭) - 특별한 패턴:
BEGIN,END
- 정규표현식:
- action: 중괄호
{}안에 기술되며, years old미콜론(;)으로 구Minutes된 하나 이상의awk명령어들로 구성됩니다. 생략되면 기본 동작은print $0(현재 라인 All Output)입니다.
특별 패턴:
BEGIN { actions }: Input 파Day을 읽기 전에 한 번 실행됩니다. 변수 Reset, 헤더 Output 등에 Use됩니다.END { actions }: 모든 Input 파Day 처리가 끝난 후 한 번 실행됩니다. 총계 Calculate, 요약 보고서 Output 등에 Use됩니다.
필드 처리와 구Minutes자
awk는 Input 라인을 **필드(field)**로 자동 Minutes리합니다.$0: 현재 처리 중인 라인 All를 나타냅니다.$1,$2,$3, ...: 첫 번째, 두 번째, years old 번째 필드를 나타냅니다.- 필드 구Minutes자 (Field Separator):
FS(Input Field Separator): Input 필드 구Minutes자입니다. Default은 Spaces(스페이스, 탭)입니다.- 명령줄에서
-F옵션으로 지정:awk -F, '{print $1}' data.csv(쉼표로 구Minutes된 CSV 파Day) BEGIN블록에서 Settings:awk 'BEGIN { FS = ":" } {print $1, $7}' /etc/passwd(콜론으로 구Minutes된 파Day)
- 명령줄에서
OFS(Output Field Separator): Output 필드 구Minutes자입니다. Default은 Spaces입니다.BEGIN블록에서 Settings:awk 'BEGIN { OFS = "\t" } {print $1, $2}' file.txt(탭으로 구Minutes하여 Output)
# /etc/passwd 파Day에서 Use자 이름(첫 번째 필드)과 셸(Day곱 번째 필드) Output, 콜론으로 구Minutes awk -F: '{print "User:", $1, "Shell:", $7}' /etc/passwd # CSV 파Day에서 첫 번째와 years old 번째 필드를 탭으로 구Minutes하여 Output awk -F, 'BEGIN{OFS="\t"} {print $1, $3}' data.csv조건문과 패턴 상세
awk는 Various 조건과 패턴을 Use하여 특정 라인에 대해서만 액션을 수행할 수 있습니다.정규표현식 패턴:
# 'error' 또는 'fail' (대Lowercase 무시) Characters열이 Include된 라인의 All Content Output /[Ee]rror|[Ff]ail/ {print $0}(쉘에서 실행 시)
awk '/[Ee]rror|[Ff]ail/ {print $0}' log.txt비교 표현식 패턴:
# years old 번째 필드의 Value이 100보다 큰 라인만 Output $3 > 100 {print "Large Value Found:", $0}(쉘에서 실행 시)
awk '$3 > 100 {print "Large Value Found:", $0}' data.txt# 첫 번째 필드가 정확히 "user_admin"인 라인의 두 번째와 네 번째 필드 Output $1 == "user_admin" {print $2, $4}(쉘에서 실행 시)
awk '$1 == "user_admin" {print $2, $4}' users.txtRange 패턴: 특정 Start 패턴부터 특정 끝 패턴까지의 모든 라인에 대해 액션을 수행합니다.
# "START_SECTION" 라인부터 "END_SECTION" 라인까지 Output /START_SECTION/,/END_SECTION/ {print}(쉘에서 실행 시)
awk '/START_SECTION/,/END_SECTION/ {print}' config.file논리 연산자:
&&(AND),||(OR),!(NOT)을 Use하여 복합적인 조건을 만들 수 있습니다.# 첫 번째 필드가 "admin"이고, 네 번째 필드가 0보다 큰 라인 Output $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
Week요 내장 변수
awk는 Various 내장 변수를 제공하여 프로그래밍을 용이하게 합니다.변수명 Description Example (쉘에서 실행 시) NRNumber of Records. 현재까지 처리한 총 레코드(라인)의 수. awk '{print NR, $0}' file.txt(라인 Number와 함께 Output)FNRFile Number of Record. 현재 처리 중인 파Day 내에서의 레코드(라인) 수. 다중 파Day 처리 시 유용. awk '{print FILENAME, FNR, $0}' file1.txt file2.txtNFNumber of Fields. 현재 레코드(라인)의 필드 개수. awk '{print "Line", NR, "has", NF, "fields:", $0}' file.txtFILENAME현재 처리 중인 Input 파Day의 이름. awk '/error/ {print FILENAME, ":", $0}' *.logFSInput Field Separator. Input 필드 구Minutes자 (Default: Spaces). awk -F';' '{print $1}' data.csv<br>awk 'BEGIN{FS=";"} {print $1}' data.csvOFSOutput Field Separator. Output 필드 구Minutes자 (Default: Spaces). awk 'BEGIN{OFS=","} {print $1, $2}' file.txt(쉼표로 구Minutes하여 Output)RSRecord Separator. Input 레코드 구Minutes자 (Default: 개행 Characters \n).awk 'BEGIN{RS="\n\n"} {print $1}' paragraphs.txt(빈 줄로 구Minutes된 단락 처리)ORSOutput Record Separator. Output 레코드 구Minutes자 (Default: 개행 Characters \n).awk 'BEGIN{ORS=";"} {print $1}' items.txt(세미콜론으로 레코드 구Minutes Output)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는 단순한 Filtering을 넘어 스크립팅 언어로서의 Feature도 provides.변수 Use:
# years old 번째 필드의 합계 Calculate { sum += $3 } END { print "Total Sum:", sum }(쉘에서 실행 시)
awk '{ sum += $3 } END { print "Total Sum:", sum }' numbers.txt연관 배열 (Associative Arrays):
awk의 배열은 Numbers 인덱스뿐만 아니라 Characters열 인덱스도 Use할 수 있습니다.# 첫 번째 필드(Yes: IP Address)의 등장 횟수 Calculate { 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루프를 Use할 수 있습니다.# 각 라인의 모든 필드를 역순으로 Output { 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까지 Numbers Output (BEGIN 블록에서) BEGIN { i=1; while(i<=5) { print i; i++ } }(쉘에서 실행 시)
awk 'BEGIN { i=1; while(i<=5) { print i; i++ } }'Use자 정의 함수 (User-Defined Functions):
function format_size(bytes, suffix_idx, suffixes) { # 로컬 변수는 Add 파라미터로 선언 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]) } # 파Day Size(ls -l의 5번째 필드)를 읽기 Easily 포맷팅 (NR > 1은 헤더 Exclude) # 쉘에서 실행하는 Example # 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 -lExample를 쉘에서 바로 실행할 수 있는 형태로 아래에 제공)ls -l | awk ' function format_size(bytes, suffix_idx, suffixes) { # 로컬 변수는 Add 파라미터로 선언하는 것이 좋은 습관입니다. # suffixes와 suffix_idx를 파라미터로 선언하여 로컬 변수처럼 Use합니다. # 실제 Value은 함수 호출 시 전달하지 않아도 됩니다. 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)}'
실무 활용 Example 심층 Minutes석
시스템 모니터링
메모리 Use량이 특정 임계Value(Yes: 5.0%)을 Seconds과하는 프로세스 Find (프로세스 ID, 메모리 Use률, 명령어 Output):
ps aux | awk 'NR > 1 && $4 > 5.0 {printf "PID: %s, %%MEM: %s, CMD: %s\n", $2, $4, $11}' # NR > 1 : 헤더 라인 Exclude # $4 > 5.0 : 4번째 필드(메모리 Use률)가 5.0보다 큰 경우 # printf : 형식화된 Output디스크 Use량이 90% 이상인 파티션 Find (파Day 시스템, Use률, 마운트 지점 Output):
df -h | awk 'NR > 1 && int($5) > 90 {print "FS:", $1, "| Usage:", $5, "| Mounted on:", $6}' # int($5) : % 기호를 제거하고 정수형으로 Convert (GNU awk에서는 $5+0 으로도 Available) # df -P | awk 'NR > 1 && $5+0 > 90 {print $1, $5, $6}' # POSIX 호환, % 자동 제거특정 포트(Yes: 80)를 Use하는 Network 연결 상태 보기:
netstat -tulnp | grep ":80\s" | awk '{print $4, $5, $7}' # $4: Local Address, $5: Foreign Address, $7: PID/Program name
로그 Minutes석
Web 서버 로그(common log format)에서 특정 Time대(Yes: 10시부터 11시 사이)의 404 에러 로그 추출 및 요청 경로 Output:
# Yes: 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 Address별 접속 횟수 Calculate 및 상위 10개 IP Output:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10 # awk '{print $1}' : 첫 번째 필드(IP Address)만 추출 # sort : IP Address Align # uniq -c : 중복 제거 및 횟수 카운트 # sort -nr : Numbers 기준 내림차순 Align (가장 많은 접속부터) # head -n 10 : 상위 10개만 OutputAWK 만으로도 Available:
awk '{ip_counts[$1]++} END {for (ip in ip_counts) print ip_counts[ip], ip}' access.log | sort -nr | head -n 10SSH 로그인 Failed 로그에서 시도된 Use자 이름과 IP Address 추출:
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번째 필드 (Use자 이름) # $(NF-3) : 뒤에서 4번째 필드 (IP Address) # 로그 형식에 따라 필드 Number는 달라질 수 Yes. # Example: "Failed password for root from 116.37.102.13 port 40940 ssh2" # 이 경우 awk '{print "User:", $9, "IP:", $11}'
데이터 처리 및 Convert
CSV 파Day에서 특정 조건(Yes: 3번째 열의 Value이 "Completed")을 만족하는 행의 1번째와 5번째 열을 새로운 CSV 파Day로 Save:
awk -F, '$3 == "Completed" {print $1 "," $5}' input.csv > output.csv또는 OFS Use:
awk -F, 'BEGIN{OFS=","} $3 == "Completed" {print $1, $5}' input.csv > output.csvText 파Day에서 모든 Email Address를 추출하여 한 줄에 하나씩 Align 및 중복 제거:
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt | sort | uniq # grep -o : Day치하는 부Minutes만 Output # \b : 단어 경계 # [A-Za-z0-9._%+-]+ : Use자 이름 부Minutes # @ : 구Minutes자 # [A-Za-z0-9.-]+ : 도메인 이름 부Minutes # \.[A-Za-z]{2,6} : 최상위 도메인 부Minutes (Yes: .com, .co.kr)Numbers 리스트 파Day에서 각 Numbers를 제곱하여 Output:
# numbers.txt Content Example: # 1 # 5 # 10awk '{print $1, "squared is", $1*$1}' numbers.txtOutput:
# 1 squared is 1 # 5 squared is 25 # 10 squared is 100여러 파Day의 특정 열 합계 Calculate (Yes: 각 파Day의 2번째 열 합계 및 총합):
# data1.txt: # itemA 10 # itemB 20 # data2.txt: # itemC 30 # itemD 40GNU Awk 확장 Use 시:
awk ' { current_sum += $2 } ENDFILE { # GNU Awk 확장. 각 파Day 처리 후 실행 print "Sum for", FILENAME, ":", current_sum total_sum += current_sum current_sum = 0 # Next 파Day을 위해 Reset } END { print "Grand Total:", total_sum } ' data*.txtPOSIX 호환 (FNR Use):
awk ' FNR == 1 && NR != 1 { # 새 파Day Start (첫 파Day Exclude) 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 # Last 파Day 합계 total_sum += current_sum print "Grand Total:", total_sum } ' data*.txt
Grep과 AWK의 조합
grep으로 1차 Filtering을 하고, 그 Result를 파이프(|)를 throughawk로 넘겨 2차 가공하는 방식은 매우 효과적입니다.# /var/log/secure 에서 "Accepted publickey" 로그 중 Use자명과 IP Address만 추출 grep "Accepted publickey" /var/log/secure | awk '{print "User:", $9, "IP:", $11, "Port:", $13}' # 현재 디렉토리의 C 소스 파Day(*.c)들 중에서 "include" 라는 단어를 Include하는 라인을 찾고, # 그 라인들에서 파Day명과 라인Number, 그리고 #include 뒤의 헤더 파Day 이름만 추출 grep -Hn "include" *.c | awk -F'[:<>]' '{print "File: " $1 ", Line: " $2 ", Header: " $4}' # grep -H: 파Day명 Output, -n: 라인Number Output # awk -F'[:<>]': 콜론(:), 여는 꺽쇠(<), 닫는 꺽쇠(>)를 구Minutes자로 Use # Yes: main.c:10:#include <stdio.h> -> $1=main.c, $2=10, $3=#include , $4=stdio.h결론
grep과awk는 리눅스/유닉스 환경에서 Text를 다루는 데 있어 스위스 군용 칼과 같은 존재입니다.grep은 강력한 패턴 Search 능력으로 원하는 Info를 Quickly 찾아내고,awk는 구조화된 데이터 처리와 리포팅에 특화되어 있습니다. 이 두 Tool의 Various 옵션과 정규표현식, 그리고awk의 프로그래밍 Feature을 깊이 이해하고 조합하여 Use한다면, 복잡하고 방대한 Text 데이터도 손Easily 원하는 형태로 가공하고 Minutes석할 수 있습니다.물론 매우 복잡한 로직이나 대규모 데이터 처리에는 Python, Perl과 같은 범용 스크립팅 언어가 더 적합할 수 있지만, 대부Minutes의 Day상적인 시스템 관리, 로그 Minutes석, 간단한 데이터 Convert 작업은
grep과awk만으로도 충Minutes히 효율적으로 처리할 수 있습니다. 꾸준한 연습과 Various 실제 문제에 적용해보는 것이 이 Tool들을 마스터하는 가장 좋은 방법입니다.