IT, 개발/서버

Ubuntu 터미널 명령어로 파일 내용 검색 & 변경(단어 찾기, 내용 바꾸기 (문자열 치환))

개발자스터디 2022. 8. 16.
728x90
반응형

 

 

명령어를 사용하여 파일 내부의 데이터를 검색하거나 원하는 문자열을 변경하는 방법을 알아보려고 합니다.

 

간단하게 편집기를 사용할 수도 있지만 내용이 매우 많은 파일이라면 명령어를 통해 데이터를 검색하는 것이 더욱 편리할 수 있고,

나중에 명령어를 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

 

결과

grep 결과

 

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

 

결과

sed 결과

 

위에서 확인했던 grep 명령어와는 다르게 문자열이 완벽히 일치하는 부분뿐만 아니라 해당 문자열 전체를 변경하게 됩니다.

그렇기 때문에 "123"이 포함된 두 번째 줄 "12345" 항목이 함께 변경된 것입니다.

 

 

 

위의 방법은 원본 파일(sample.txt)의 내용을 변경하는 방법이고,

원본 파일은 변경하지 않은 채로 새로운 파일에 변경 내용을 적용할 수 있는 방법이 있습니다.

 

$ sed 's/123/111/' sample.txt < newfile.txt

위 명령어를 사용하면 문자열이 변경된 최종 결과가 newfile.txt로 저장되고,

sample.txt 파일의 내용은 변경되지 않습니다.

 

 

 

 

 

 

728x90
반응형