본문 바로가기
SECURITY ::/Security Academy

5일차 - 리눅스 기초실습 03

by bbombi 2024. 3. 10.

 

 

 

 


 

* 파일, 디렉터리의 소유권과 허가권 - 파일 속성

 

* 파일 유형

 - 파일이 어떤 종류인지 나타냄

 - 디렉터리 : d

 - 일반 파일 : -

 - 블록 디바이스 : b

 - 문자 디바이스 : c

 - 링크 파일 : l

 

* 파일 허가권

 - 파일에 대한 접근 권한을 의미하며, 읽기는 r, 쓰기는 w, 실행은 x로 표현

 - 파일의 소유자, 그룹, 그 외 사용자로 접근권한을 부여함

 

* grep : 입력으로 전달된 파일의 내용에서 특정 문자열을 찾기

 - 기본 형식 : grep <옵션><패턴><파일이름>

 - 옵션) i : 대/소문자 무시

          w : 단어 단위로 매칭 

          n : 검색 문자열의 라인 번호 출력

          r : 하위 디렉토리를 포함해 검색

               ex) grep -r "입력문자" *

 

 

* sed (Streaming Editor) : 원본 문서 파일을 원본을 유지하며 내용을 빠르게 편집하는 도구

 - 기본 형식 : sed <옵션><명령><파일이름>

 - 옵션) -n : 패턴 버퍼의 내용을 출력 안함

            -e : 추가 명령어 입력

 - 명령) p : 특정 행 출력

            d : 특정 행 삭제

            s : 단어 치환

            r : 내용 추가

ex)

[root@localhost ~]# echo "sim 010-6666-6666" > add
[root@localhost ~]# cat add
sim 010-6666-6666

[root@localhost ~]# sed -n -e '/5555$/r add' -e '1,$p' sample
name	phone
kim	010-1111-1111
lee	010-2222-2222
pak	010-3333-3333
hong	010-4444-4444
yoo	010-5555-5555
sim 010-6666-6666

// 변경한 내용을 sample1 파일을 생성하여 저장
[root@localhost ~]# sed -n -e '/5555$/r add' -e '1,$p' sample > sample1
[root@localhost ~]# cat sample1
name	phone
kim	010-1111-1111
lee	010-2222-2222
pak	010-3333-3333
hong	010-4444-4444
yoo	010-5555-5555
sim 010-6666-6666

ex)

// 실습 위한 sedtest 파일 생성
[root@localhost ~]# cat sedtest
Bob	M
Jane	F
Tony	m
Soo	f

// M은 Male로, F는 Female로 한번에 치환 (i->대소문자구분x)
[root@localhost ~]# sed -n -e 's/M/Male/gi' -e 's/F/Female/gi' -e '1,$p' sedtest
Bob	Male
Jane	Female
Tony	Male
Soo	Female

// Bom 처럼 다른 문자에도 m이 있을 경우 필터링
[root@localhost ~]# sed -n -e 's/\bM/Male/gi' -e 's/\bF/Female/gi' -e '1,$p' sedtest
Bom	Male
Jane	Female
Tony	Male
Soo	Female

 

 

* awk : 텍스트 처리 프로그래밍.

            파일 내 문자의 패턴을파악하고 분류, 조작, 연산 등을 수행하는 명령

 - 기본 형식 : awk  <옵션><awk 프로그램><파일이름>

 - 옵션) -f : 파일의 awk 프로그램을 사용

            -F : 필드의 구분 문자를 변경

 

ex)

[root@localhost ~]# awk '{ print }' awksample 
A 10 11 12
B 20 21 22
C 30 31 32
D 40 41 42
// 특정 필드만 출력
[root@localhost ~]# awk '{ print $2 }' awksample 
10
20
30
40
// 문자열 추가
[root@localhost ~]# awk '{ print "Name:"$1, "Num:"$2 }' awksample 
Name:A Num:10
Name:B Num:20
Name:C Num:30
Name:D Num:40
// 모든 레코드 중 두번째 필드값이 10인 레코드를 출력
[root@localhost ~]# awk '$2 == 10 { print $0 }' awksample 
A 10 11 12
// 두번째 필드의 값이 20보다 큰 레코드를 출력
[root@localhost ~]# awk '$2 > 20 { print $0 }' awksample 
C 30 31 32
D 40 41 42
// 세번째 필드의 값을 모두 더한 결과를 "SUM:" 메시지와 함께 출력
[root@localhost ~]# awk '{sum += $3} END { print "SUM : "sum}' awksample
SUM : 104
// 레코드 단위로 합과 평균을 출력 cf) 행마다 처리하고 싶을 때는 END 사용x
[root@localhost ~]# awk '{sum=0} {sum+=($2+$3+$4)} { print $0,sum,sum/3 }' awksample
A 10 11 12 33 11
B 20 21 22 63 21
C 30 31 32 93 31
D 40 41 42 123 41
// 파일에 저장된 awk 프로그램을 실행 cf) NF(내장변수) : 현재 처리중인 레코드의 필드 개수
[root@localhost ~]# touch awkp.script
[root@localhost ~]# vi awkp.script
[root@localhost ~]# cat awkp.script
{
	for (i=0; i<=NF; i++)
		total += $i
}
END {
	print "TOTAL : "total
}
[root@localhost ~]# awk -f awkp.script awksample
[root@localhost ~]# awk -f awkp.script awksample
TOTAL : 312

 

 

// sample 파일 생성
[root@localhost ~]# cat bmisample
A 170 73
B 165 73
C 180 70
D 150 60

// 비만도 계산
[root@localhost ~]# awk '{ printf "%s %d %d %.4f\n", $1, $2, $3, $3/((($2)/100)*($2/100)) }' bmisample
A 170 73 25.2595
B 165 73 26.8136
C 180 70 21.6049
D 150 60 26.6667

// 비만도 판정

 

 

* 리눅스 패키지 관리

* 리눅스 패키지 매니저(PM, Package Manager)

 - 리눅스 시스템에 프로그램을 설치하고, 업그레이드, 환경설정 등을 수행하는 프로그램

 

* apt : 패키지 관리 명령어

 - 데비안(.deb) 설치, 제거, 목록 업데이트 명령

 apt update : 패키지 목록을 업데이트

 apt install : 패키지 설치

 apt remove : 기존에 설치된 패키지 제거

 apt purge : 기존에 설치된 패키지 및 설정파일 제거

 apt autoremove : 사용하지 않는 패키지를 모두 제거

 apt clean : 설치할 때 내려받기한 파일 제거

* 패키지를 설치하기 전 패키지에 대한 정보나 의존성을 확인하는 명령

 기본 형식 ) apt-cache <명령><패키지이름>

 명령 ) show : 패키지의 정보를 화면에 출력

           depends : 패키지에 대한 의존성 정보를 출력

           rdepends : 이 패키지에 의존하는 다른 패키지 목록 출력

cf) centOS -> yum info [패키지이름]

 

 

* tar : 파일 묶기와 압축

 - tar로 archive 파일 생성하기

 기본 형식 ) tar <옵션><파일|디렉토리>

 옵션 )  -f file : 새롭게 만들 아카이브 파일의 이름을 지정할 때 사용함. (기본 옵션)

            -c : create. 새로운 아카이브를 생성함. 기존 아카이브 덮어쓰기. (파일 묶을 때 사용)

            -t : list. 아카이브 파일에 포함된 내용 출력

            -v : verbose. 처리되는 과정(파일 정보)을 자세하게 나열

            -x : extract. 아카이브 압축 해제

            -z : -f 옵션을 함께 사용하여 gzip으로 압축된 archive 파일 해제

// archive 디렉토리 생성 후 테스트 파일 100개 생성
[root@localhost ~]# mkdir archive
[root@localhost ~]# cd archive
[root@localhost archive]# touch tarTest{00..99}
[root@localhost archive]# ls
tarTest00  tarTest01  tarTest02  tarTest03  
...  
tarTest97  tarTest98  tarTest99

// archive.tar 파일 생성
[root@localhost ~]# tar -cvf archive.tar archive
[root@localhost ~]# ls
archive.tar archive

// archive.tar 파일 크기 확인 
[root@localhost ~]# ls -l archive.tar	// ls -lh -> 60K
-rw-r--r--. 1 root root 61440  2월 28 14:50 archive.tar

// backup 폴더에 풀기
[root@localhost ~]# tar -xf backup/archive.tar
[root@localhost ~]# cd backup/
[root@localhost backup]# ls
archive  archive.tar
[root@localhost backup]# cd archive/
[root@localhost archive]# ls
tarTest00  tarTest01  tarTest02  tarTest03  
...  
tarTest97  tarTest98  tarTest99

 

 

* gzip, bzip2, xz : 리눅스 압축 유틸리티

 - file 단위로만 압축

 - 압축을 하면 원본 파일은 삭제되고 압축 파일만 남음

// hosts를 gzip으로 압축
[root@localhost etc]# gzip hosts
[root@localhost etc]# ls hosts.gz
hosts.gz

// 원본 파일은 삭제됨
[root@localhost etc]# ls hosts
ls: cannot access hosts: 그런 파일이나 디렉터리가 없습니다

 

 

* zip, unzip

 - 원본을 보존하면서 압축파일 생성

 - 디렉토리 압축 가능

기본 형식 ) zip filename.zip filename

                  unzip filename.zip

옵션 ) -r : 디렉토리 압축

          -d : 지정한 디렉토리에 압축 해제

          -l : 압축을 해제하지 않고, 압축 파일 내의 목록만 출력

 

실습 ) 압축(gzip, bzip2,xz, zip) 활용

// 5~10메가바이트 사이즈 파일 찾기
[root@localhost ~]# find /usr/lib -type f -size +5M -size -10M -exec ls -lh {} \;
-rw-r--r--. 1 root root 6.4M  2월 15 00:06 /usr/lib/firmware/netronome/flower/nic_AMDA0058.nffw
-rw-r--r--. 1 root root 5.4M  2월 15 00:06 /usr/lib/firmware/qcom/sdm845/modem.mbn

[root@localhost ~]# find /usr/lib -type f -size +5M -size -10M -exec cp {} - \;

// ziptest 디렉토리에 해당 파일들을 복사
[root@localhost ~]# mkdir ziptest
[root@localhost ~]# cp /usr/lib/firmware/qcom/sdm845/modem.mbn /home/ziptest

// 파일들을 묶어서 각각 gzip,bzip2,xz,zip로 압축하기
[root@localhost ~]# zip ziptest.zip ziptest
[root@localhost ~]# tar -czf ziptest.tar.gz ziptest
[root@localhost ~]# tar -cjf ziptest.tar.bz2 ziptest
[root@localhost ~]# tar -cJf ziptest.tar.xz ziptest

// 어떤 압축 명령어의 압축 효율이 제일 높은지 알아보기
[root@localhost ~]# ls -lh ziptest.tar.gz ziptest.tar.bz2 ziptest.tar.xz ziptest.zip
-rw-r--r--. 1 root root 2.9M  2월 28 15:53 ziptest.tar.bz2
-rw-r--r--. 1 root root 4.7M  2월 28 15:53 ziptest.tar.gz
-rw-r--r--. 1 root root 1.8M  2월 28 15:54 ziptest.tar.xz
-rw-r--r--. 1 root root  166  2월 28 15:49 ziptest.zip



두번째방법!!!
// tar파일 4개 만들고 각각 유형별로 압축하기
[root@localhost ~]# cp archive1.tar archive4.tar
gzip archive1.tar
bzip2 archive2.tar
xz archive3.tar
zip archive4.tar.zip zrchive4.tar

[root@localhost ~]# ls -lh archive*

 

 

 

 

댓글