IT 프로그래밍/오픈소스소프트웨어

[오픈소스소프트웨어 ]chap5-1 표준입출력

기술1 2024. 10. 12. 11:19
반응형

표준 입출력

쉘 명령에 대해서는 3가지의 기본 입출력 장치가 사용됩ㄴ니다.

 

stdin

  • 표준 입력장치로써 명령에 데이터를 공급합니다. 디폴트는 키보드

stdout

  • 표준 출력장치로써 명령의 출력이 전달됩니다. 디폴트는 터미널 화면

stderr

  • 에러 메세지가 출력되는 장치로써 디폴트는 터미널 화면

 

출력 리다이렉션

> 기호를 사용하여 출력 스트림을 변경할 수 있습니다.

$echo It is cold today!
$echo It is cold today! > winter.txt
$echo It is cold today! > winter.txt
$echo It is cold today! >> winter.txt
$cat >names.txt
Tom
Alice
Bob
#^D를 누른다(입력 파일 종료)
$cat names.txt

#새 파일을 생성하고 쓴다.
#기존에 있는 파일의 내용을 덮어쓴다.
#기존 내용에 추가한다(append)

여기로 저장하라는 뜻입니다.

에러 리다이렉션

'2>'를 사용하여 에러를 바꿀 수도 있습니다.

 

$find / 를 하면 루트 아래 모든 파일을 출력해줍니다.

 

파이프(pipe, |)

이전 명령의 출력을 다음 명령의 입력으로 전달됩니다.

$command1 | command2

다음 명령의 출력이 다음 명령의 입력으로 들어가는 구조입니다.

wordcount

입력 리다이렉션

< (또는 0< ) 를 사용하여 표준 입력장치를 변경

$sort < names.txt
$sort < names.txt > sorted_names.txt

필터

표준 입력장치에 전달된 데이터에 대해 특정한 동작을 수행하는 명령

 

필터링 : 문자 치환, 단어 또는 라인 수 세기, 단어 찾기 등

 

주로 파이프와 같이 사용됨

 

주요 필터 명령

cat : 표준입력으로 전달된 데이터를 그대로 표준출력으로 전달

tee : 표준입력으로 전달된 데이터를 파일과 표준출력 양쪽으로 전달

grep :  주어진 문자열을 포함하는 라인을 찾는다.

tr : 문자 단위로 변환

wc : 단어, 라인수, 문자루를 계산한다.

sort : 입력 데이터를 정렬한다.

uniq : 입력 데이터에서 중복을 제거한다.

sed : 정규식을 사용하여 치환한다.

head : 파일 앞쪽 일부 라인만 출력(<>tail)

 

find

주어진 조건과 일치하는 파일을 검색하기 위한 명령

 

$find [-H][-L][-P][-D debug][starting poinrts][expression]

  • H,L,P는 symbolic link를 처리하는 옵션
  • -D : 디버깅을 위해 find 의 처리과정을 보여주는 ㅇ보션
  • -Olevel : find 실행효율을 높이는 최적화 수준을 설정
  • [starting-points] : 검색 시작 위치(디렉토리, 디폴트는 현재 디렉토리
  • [expression] : 조건식은 test와 action을 -not, -a(-and), -o(-or)로 연결한 것, 디폴트는 -print(파일 이름을 출력)
  • test : -mtime,-anewer,-cnewer,-cmin,-regex,-type,-uid,-user등
  • action : -print, -printf포맷, -delete, -quit 등

 find / etc> etcfiles.txt

etc 디렉토리의 모든 파일명을 찾아서 etcfiles.txt에 저장

 

위의 경우 에러는 dev/null로 보내줍니다.

 

find . -name '*.sh'

현재 디렉토리 및 서브 디렉토리에서 파일명이 .sh로 끝나는 파일을 모두 출력

 

find -type d -name '*.conf'

현재 디레곹리 및 서브 디렉토리에서 파일명이 .conf인 디렉토리를 모두 출력

 

find . -newer example.txt

현재 디렉토리 및 서브 디렉토리에서 example.txt 파일보다 새 파일들을 모두 출력

 

find / data - name '*.odf' -exec cp {} /backup/\;

데이터 디렉토리 및 서브 디렉토리에서 이름이 .odf 로 끝나는 파일들을 /backup 디렉토리에 복사

 

find /data -name '*.odf' -ok rm {} /backup/\;

/data 디렉토리 및 서브 디렉토리에서 이름이 .odf로 끝나는 파일을 찾아 사용자에게 동의를 얻은 뒤에 삭제함

 

locate

모든 디렉토리에서 주어진 패턴에 해당하는 파일을 찾음

  • 단 시스템에 구축되어 있는 인덱스를 사용하기 때문에 새로 추가된 파일들이 검색 대상에서 누락될 수 있음
  • updatedb 명령을 사용하여 최신 인덱스를 구축해야 함

형식

locate[option] ... [pattern] ...

 

sleep

  • 주어진 시간(초 단위) 동안 sleep 모드를 대기
  • 주로 쉘스크립트에서 대기를 위해 사용

time

뒤에 오는 명령을 실행하는데 소요된 시간을 출력함

 

gzip 압축

파일을 압축하고 압축된 파일은 .gz 확장자가 추가됨

 gunzip allfiles.txt.gz 같이도 가능

 

zcat은 압축을 풀어서 화면에 보여줌

 

실습

두 명령의 차이에 대해 설명하라

$find/data-name "*.txt"

$find/data-name *.txt

첫번째는 모든 .txt파일을 찾습니다. 하지만 따음표 없이 하게 되면 쉘에 의해서 확장이 됩니다. 현재 디렉토리에 data.txt가 있었다면 이 부분이 data.txt로 치환이 되어서 find/data -name data.txt이것이 전달이 됩니다.

 

이것은 /data 디렉토리에서 시작해서 파일의 이름이 data.txt인 것을 찾으라는 것이 됩니다. 앞에것은 txt로 끝나는 모든 파일을 찾으라는 것이지만 두번째꺼는 data.txt를 찾으라는 것으로 됩니다.


$find /data -name '*.odf' > data_odf.txt

위 코드는 /data 디렉토리에서 .odf 파일을 찾고 그 결과를 data_odf.txt 파일에 출력합니다. .odf는 와일드카드를 사용하여 모든 .odf 확장자를 가진 파일을 찾습니다.

$find /data/*.odf > data_odf.txt

이 명령어는 쉘에서 /data/*.odf 와일드카드를 먼저 확장합니다. 즉 실제로 find 명령어가 실행되기 전에 /data에 있는 .odf파일을 찾아 확장하고, 그 결과를 data_odf.txt 파일에 저장합니다. 만약 디렉토리 내에 해당 파일이 없다면 에러가 발생할 수 있습니다.

 

그래서 처음은 data의 하위 디렉토리까지 모두 찾지만 두번째는 하위 디렉토리를 검색하지 않습니다.


/etc 디렉토리와 그것의 서브디렉토리에서 '*.conf' 패턴의 파일이름을 모두 찾아서 그 개수를 출력하라

 

$find /etc -name '*.conf' | wc - l

 

반응형