명령어를 사용하여 파일 내부의 데이터를 검색하거나 원하는 문자열을 변경하는 방법을 알아보려고 합니다.
간단하게 편집기를 사용할 수도 있지만 내용이 매우 많은 파일이라면 명령어를 통해 데이터를 검색하는 것이 더욱 편리할 수 있고,
나중에 명령어를 sh파일로 만들어서 나만의 검색기 혹은 문자열 변경하는 sh파일을 만들 수도 있습니다.
1. 데이터 검색하기
grep 명령어를 사용하여 데이터를 검색합니다.
--help 명령어를 통해 기능과 옵션을 살펴보도록 하겠습니다.
$ grep --help
결과
사용법: grep [<옵션>]... <패턴> [<파일>]...
각 <파일>에서 <패턴>에 일치하는 행을 검색합니다.
예제: grep -i 'hello world' menu.h main.c
<패턴>에는 개행 문자로 구분한 여러 패턴을 넣을 수 있습니다.
패턴 선택 및 해석:
-E, --extended-regexp <패턴>은 확장 정규 표현식입니다
-F, --fixed-strings <패턴>은 단순 문자열입니다
-G, --basic-regexp <패턴>은 기본 정규 표현식입니다
-P, --perl-regexp <패턴>은 펄 정규 표현식입니다
-e, --regexp=<패턴> 일치하는 부분을 찾을 <패턴> 기준을 활용합니다
-f, --file=<파일> <파일>에서 <패턴>에 일치하는 부분을 취합니다
-i, --ignore-case 대소문자 구분을 무시합니다
--no-ignore-case 대소문자 구분을 유지합니다(기본값)
-w, --word-regexp 주어진 단어와 완벽하게 일치하는 부분만
-x, --line-regexp 주어진 행 내용과 완벽하게 일치하는 부분만
-z, --null-data 데이터 행의 끝은 개행 문자가 아닌 0바이트 값으로 끝납니다
기타:
-s, --no-messages 오류 메시지 출력을 생략합니다
-v, --invert-match 조건에 일치하지 않는 행을 선택합니다
-V, --version 버전 정보를 나타내고 빠져 나갑니다
--help 이 도움말 텍스트를 나타내고 빠져 나갑니다
출력 제어:
-m, --max-count=<횟수> <횟수> 만큼 행을 찾아내고 나면 멈춤
-b, --byte-offset 출력 행의 바이트 오프셋을 출력합니다
-n, --line-number 출력 행의 행 번호를 출력합니다
--line-buffered 모든 행의 출력을 플러싱합니다
-H, --with-filename 출력 행에 파일 이름을 출력합니다
-h, --no-filename 출력 행 앞부분의 파일 이름 표시를 생략합니다
--label=<레이블> <레이블>을 표준 입력 앞부분의 파일 이름으로 사용합니다
-o, --only-matching 조건에 일치하는 행이 비어있지 않은 결과만 나타냅니다
-q, --quiet, --silent 모든 일반 출력 동작을 생략합니다
--binary-files=<형식> 바이너리 파일을 지정한 <형식>으로 간주합니다
<형식> 값은 'binary', 'text', 'without-match' 중 하나입니다
-a, --text --binary-files=text 옵션과 동일
-I --binary-files=without-match 옵션과 동일
-d, --directories=<동작> 디렉터리 처리 방식
<동작> 값은 'read', 'recurse', 'skip' 중 하나입니다
-D, --devices=<동작> 장치, FIFO, 소켓 처리 방식
<동작> 값은 'read', 'skip' 중 하나입니다
-r, --recursive --directories=recurse와 유사
-R, --dereference-recursive 위 옵션과 비슷하지만 모든 심볼릭 링크를 따라갑니다
--include=<글롭> <글롭>(파일 패턴)에 일치하는 파일만 검색합니다
--exclude=<글롭> <글롭>에 일치하는 파일을 건너뜁니다
--exclude-from=<파일> <파일>과 파일 패턴이 일치하는 파일을 건너뜁니다
--exclude-dir=<글롭> <글롭>과 일치하는 디렉터리를 건너뜁니다
-L, --files-without-match 일치하는 행이 없으면 <파일>의 이름만 출력합니다
-l, --files-with-matches 일치하는 행이 있는 <파일>의 이름만 출력합니다
-c, --count <파일>에 일치하는 행 갯수만 출력합니다
-T, --initial-tab (필요한 경우) 행 별로 탭을 표시합니다
-Z, --null <파일> 이름 뒤에 0 바이트 값을 출력합니다
문맥 제어:
-B, --before-context=<갯수> <갯수> 줄 수만큼 출력 내용의 앞부분을 출력합니다
-A, --after-context=<갯수> <갯수> 줄 수만큼 출력 내용의 뒷부분을 출력합니다
-C, --context=<갯수> <갯수> 줄 수 만큼 출력 내용 앞 뒤 부분을 모두 출력합니다
-NUM --context=NUM과 동일
--color[=<시기>],
--colour[=<시기>] 는 일치하는 문자열 강조시 마커를 활용합니다
<시기>의 값은 'always', 'never', 'auto' 중 하나입니다
-U, --binary 개행 문자에서 CR 문자를 빼내지 않음(MSDOS/윈도우)
<파일> 값이 '-' 이면, 표준 입력을 읽습니다. <파일>에 아무런 값이 없다면,
재귀 탐색 옵션을 주었을 경우 현재 디렉터리를, 그렇지 않으면 '-' 값을 설정함
으로 가정합니다. <파일> 갯수가 한개일 경우 -h 옵션을 준 것으로 가정합니다.
조건 일치 행이 나오면, 끝내기 상태 값은 0을, 그렇지 않으면 1을 반환합니다.
오류가 나타났거나 -q 옵션을 주지 않았다면, 2를 반환합니다.
버그 보고 주소: bug-grep@gnu.org
GNU grep 홈 페이지: <http://www.gnu.org/software/grep/>
GNU 소프트웨어 활용 일반 도움말: <https://www.gnu.org/gethelp/>
데이터 검색 명령어입니다.
$ grep -w "찾을문자열" filename.txt
예제를 통해 확인해보도록 하겠습니다.
sample.txt
ABCDE
12345
ABC 123
sample.txt 파일에서 "123"이라는 문자열을 아래 명령어로 찾고자 합니다.
$ grep -w "123" sample.txt
결과
w 옵션은 주어진 단어와 완벽하게 일치하는 부분만 검색하기 때문에 12345 항목은 표시되지 않습니다.
2. 문자열 변경하기
sed 명령어를 사용하여 문자열을 변경하려고 합니다.
--help 명령어를 통해 기능과 옵션을 살펴보도록 하겠습니다.
$ sed --help
결과
사용법: sed [<옵션>]... {<스크립트>} [<입력파일>]...
-n, --quiet, --silent
패턴 영역의 자동 출력을 생략합니다
--debug
프로그램 실행 과정을 나타냅니다
-e script, --expression=<스크립트>
실행할 스크립트를 명령에 추가합니다
-f script-file, --file=<스크립트-파일>
실행할 스크립트 파일 내용을 명령에 추가합니다
--follow-symlinks
심볼릭 링크의 대상 파일을 처리할 경우 심볼릭 링크를 따라갑니다
-i[<접미부>], --in-place[=<접미부>]
지정 위치에서 파일을 편집합니다(<접미부>를 설정하면 백업 파일 만듦)
-l N, --line-length=N
`l' 명령에 원하는 줄 바꿈 문자열 길이를 지정합니다
--posix
모든 GNU 확장을 비활성화합니다.
-E, -r, --regexp-extended
스크립트에 확장 정규 표현식을 사용합니다
(간이 방식 POSIX -E 활용).
-s, --separate
파일을 긴 연속 스트림 단일체가 아닌,
분할체로 간주합니다.
--sandbox
샌드박스 모드로 실행합니다 (e/r/w 명령 사용 불가).
-u, --unbuffered
입력 파일에서 최소한의 데이터를 불러오고
출력 버퍼로 내보내는 과정을 빈번히 수행합니다
-z, --null-data
널 문자 개행
--help 이 도움말을 표시하고 나갑니다
--version 버전 정보를 출력하고 나갑니다
-e, --expression, -f, --file 옵션 중 설정한 옵션이 없다면, 옵션이 없는
첫번째 인자를 해석할 sed 스크립트로 취합니다. 남아있는 모든 인자는
입력 파일의 이름입니다. 입력 파일을 지정하지 않으면 표준 입력을 읽습
니다.
GNU sed 홈 페이지: <https://www.gnu.org/software/sed/>.
GNU 소프트웨어 활용 일반 도움말: <https://www.gnu.org/gethelp/>.
버그 보고 전자메일 주소: <bug-sed@gnu.org>.
sed 명령어의 i 옵션을 사용하여 문자열을 변경하는 방법입니다.
$ sed -i 's/기존문자열/변경할문자열/' filename.txt
예시)
$ sed -i 's/123/111/' sample.txt
결과
위에서 확인했던 grep 명령어와는 다르게 문자열이 완벽히 일치하는 부분뿐만 아니라 해당 문자열 전체를 변경하게 됩니다.
그렇기 때문에 "123"이 포함된 두 번째 줄 "12345" 항목이 함께 변경된 것입니다.
위의 방법은 원본 파일(sample.txt)의 내용을 변경하는 방법이고,
원본 파일은 변경하지 않은 채로 새로운 파일에 변경 내용을 적용할 수 있는 방법이 있습니다.
$ sed 's/123/111/' sample.txt < newfile.txt
위 명령어를 사용하면 문자열이 변경된 최종 결과가 newfile.txt로 저장되고,
sample.txt 파일의 내용은 변경되지 않습니다.
'IT, 개발 > 서버' 카테고리의 다른 글
Kafka 우분투에 설치 방법(kafka 설치, topic 생성, 통신 테스트) (0) | 2022.09.06 |
---|---|
RabbitMQ를 사용한 AMQP 통신 구성하기 (Ubuntu) (0) | 2022.08.26 |
우분투 apt 업데이트 오류 (다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다: NO_PUBKEY) (0) | 2022.08.05 |
우분투에 Docker 설치하기 (Ubuntu 터미널 명령어로 설치) (0) | 2022.08.04 |
ssh 파일 전송하기 (터미널 scp 명렁어로 파일 전송) (0) | 2022.08.03 |