비트교육센터/리눅스

[비트교육센터][리눅스] 2일차 config, bash, grep, awk, 파일링크, tar, gzip

달의요정루나 2023. 8. 22. 00:50

1. config 파일

[1] config 파일 만들기

[1] C드라이브에서 사용자로 들어가 .ssh폴더로 들어간다.
[2] config파일을 만든다. '새로만들기->텍스트문서'로 가서 config라고 파일명을 입력하고 .txt는 지워버린다.
[3] Notepad++로 파일을 연다.
[4] 다음처럼 입력한다.

Host ubuntu22
	Hostname localhost
	User last
	Port 2200
	#IdentityFile ~/.ssh/idrsa

- 하나의 서버에 대한 ssh접속용 정보를 담아둔다.

- 여담으로, aws는 암호화 키파일로 들어감, 암호화 파일을 IdentityFile경로에 ~/.ssh/이하에 둠

[5] 그러면 일일이 주소를 쓸 필요없이 ssh ubuntu22만 입력하면 리눅스 서버에 접속이 가능해진다.

2. 파일 전송

[1] 파일 전송하기

[1] 같은 경로에 있던 known_hosts를 리눅스 서버로 전송시켜 보겠다.
[2] .ssh 경로로 디렉토리를 바꾼 후 scp .\known_hosts ubuntu22:~work라고 입력해 리눅스의 work디렉토리 경로로 known_hosts를 전송한다.
[3] 리눅스 서버 work디렉토리에 known_hosts가 전송되었다.

3. 명령어 

[1] rmdir

- 디렉토리를 지우는 명령어이다.

[1] test01디렉토리와 test01안에 test02디렉토리로 만들고 test01 디렉토리로 이동한다.
[2] ls -l을 입력하면 test02 디렉토리가 있음을 확인할 수 있다.
[3] rmdir test02를 입력하면 test02디렉토리가 지워진다.

[2] touch

- touch[파일명]: 해당파일이 없으면 사이즈가 0인 파일을 생성, 있으면 최종수정시간으로 업데이트한다.

1) 해당 파일이 없을 때

[1] 다시한번더 test02디렉토리를 만들고 test02로 이동한다.
[2] touch 명렁어로 text01,text02,text03파일을 생성한다.(사이즈는 0이다.)

touch text01
touch text02
touch text03

- text01, text02, text03은 해당 디렉토리에 없기 때문에 사이즈가 0인 파일이 생성된다.

2) 해당 파일이 있을 때

[1] work 디렉토리에서 touch sample1을 입력하면 생성날짜가 오늘로 최신화 된다.

[3] rm 디렉토리명/*,rm -R

rm 디렉토리명/*, rm -R: 디렉토리를 강제제삭제한다.

1) rm 디렉토리명/*

[1] text들이 담겨있는 test02디렉토리는 rmdir로 삭제되지 않는다.
[2] rm test02/*를 입력하면 삭제된다.

2) rm -R

[1] 다른 방법으로는 rm -R를 이용해 디렉토리를 강제삭제 할 수 있다.

[4] 파일 사용정도 확인하기

1) df: 파일 시스템 디스크 공간 확인

df를 입력하면 파일들이 얼마정도 사용중인지 알수 있음

2) df -h: 보기편하게 출력

h옵션을 써서 보기 편하게 출력한다.

3) du -h: 디스크의 용량을 확인한다. h 옵션은 보기 쉬운 단위(바이트 단위)로 출력한다.

바이트 단위로 출력한다.

3) du -hs: h-보기편하고, 지정된 디렉토리 내 파일들의 용량을 합쳐서 출력한다.

특정 메모리가 얼마나 차지하는지 알 수 있다.
work디렉토리 이하로 용량을 합쳐서 출력한다.
last 디렉토리 이하로 용량을 합쳐서 출력한다.

[5] top

top: 서버의 상태를 파악한다.

[6] :se list

se list: 숨겨진 기호들을 표시한다.

^I는 탭문자를 의미하고 $는 줄바꿈 문자이다. :se nolist를입력하면 없어진다.

[7] vimrc

[1] root 디렉토리에서 ls -al을 입력해 .vimrc파일을 찾는다.(.으로 시작하는 것은 숨김파일)
[2] .vimrc를 연다..
[3] 다음처럼 입력한다.

set cindent
set tabstop=4 
set shiftwidth=4

- cindent: c언어 형식의 들여쓰기 적용

- tabstop: tab을 4칸으로 한정

- shiftwidth: 자동들여쓰기

[4] sample1파일을 연다.
[5] 탭키가 4칸으로 지정되어서 칸이 약간 줄어들었다.

[8] colors

[1] root디렉토리에서 cd /usr/share/vim/vim82/colors입력해 해당 경로로 이동한다.
[2] ls -al을 입력하면 다양한 글자색과 배경색이 있음을 확인할 수 있다.
[3] .vimrc파일을 연다.
[3] 하단에 colorscheme blue를 입력한다.
[5] 나갔다가 다시 들어오면 배경이 파란색인 것을 볼 수 있다.

4. make 유틸리티

- make 유틸리티: 프로그램 그룹 중에서 어느 부분이 새롭게 컴파일 되어야 하는지를 자동적으로 판단해서 필요한 커맨드(gcc 따위)를 이용해서 컴파일 시킨다.

[1] 디렉토리 만들기

[1] work 디렉토리에 make_test드렉토리를 만든다.

[2] c언어 파일 만들기

[1] make_test 디렉토리에 int_add.c파일을 만든다.
[2] 다음처럼 입력한다.

int int_add(int a, int b)
{
	return a+b;
}

[3] 같은 방법으로 cal_main.c파일을 만든다.
[4] 다음처럼 입력한다.

#include <stdio.h>

extern int int_add(int, int);
int main(void)
{
	int num1 = 10, num2 = 30;
    print("num1 + num2 = %d\n",int_add(num1,num2));
    
    return 0;
}

[3] 컴파일하기

[1] gcc -c int _add.c를 입력해 컴파일한다. 그러면 int_add.o파일이 생성된다.
[2] gcc -c cal _main.c를 입력해 컴파일한다. 그러면 cal_main.o파일이 생성된다.

[4] 실행하기

[1] gcc -o cal_main int_add.o cal_main.o를 입력한다.
[2] 설정된 경로에서만 찾기 때문에 cal_main만 입력하면 실행되지 않는다.
[3] ./cal_main을 입력하면 실행된다.

[5] .bashrc

[1] echo $PATH를 입력하면 리눅스 환경변수들의 경로를 볼 수 있다.
[2] ls -al ~를 입력해 .bashrc파일을 찾는다.
[3] vi ~/.bashrc를 입력해 해당파일을 연다.
[4] 맨 아래쪽으로 내려간다.
[5] export PATH=$PATH:/home/last/work/make_test를 경로를 입력한다.

- export: 프로그램 생성해서 띄울때 해당 PATH를 들어있게 하는 것.

make_test 디렉토리에서 cal_main만 입력하면 결과가 출력된다.
다른 경로에서는 '. ~/.bashrc'를 입력해야 한다.

[6] 실행파일 통합하기

1) Makefile 만들기

[1] vi Makefile입력해 Makefile을 만든다.
[2] 다음 처럼 입력한다.

cal_main: int_add.o cal_main.o
	gcc -o cal_main int_add.o cal_main.o

int_add.o: int_add.c
	gcc -c int_add.c

cal_main.o: cal_main.c
	gcc -c cal_main.c

- cal_main 실행파일 만들때 int_add.o, cal_main.o가 필요하다.

- 왼쪽에는 반드시 탭을 쓴다.

[3] Makefile을 저장한다.
[4] touch cal_main.c를 입력해 해당 파일을 수정했다고 가정한다.
[5] make를 입력해 수정한 것만 빌드한다.
[5] 오브젝트 파일들이 생성되었다.

2) clean 추가

다음 처럼 아래쪽에 clean을 입력한다.

cal_main: int_add.o cal_main.o
	gcc -o cal_main int_add.o cal_main.o

int_add.o: int_add.c
	gcc -c int_add.c
    
cal_main.o: cal_main.c
	gcc -c cal_main.c

clean:
	rm -f cal_main cal_main.o int_add.o

- make clean을 입력하면 이전에 입력된 내용이 지워진다.

3) Makefile 만들기(gnu 기능 적용)

cal_main: int_add.o cal_main.o
	gcc -o $@ int_add.o cal_main.o

int_add.o: int_add.c
	gcc -c $<

cal_main.o: cal_main.c
	gcc -c $<

clean:
	rm -f cal_main cal_main.o int_add.o

all: cal_main

- gnu에서 제공하는 기능으로 $@는 현재 타겟을 나타냄

- $<는 수정한 것들을 다시 컴파일해 int_add.o 혹은 cal_main.o를 다시 생성

- all: cal_main을 입력해 make all을 입력하면 make와 같은 역할을 해준다. 레이블을 달아 실행할 수 있음을 보여준다.

make만 입력하면 바로 실행파일이 만들어진다.(make clean을 한번해 이전에 생성한 것을 지워준다.)

4) 생성할 오브젝트 파일 합치기

다음처럼 입력한다.

cal_main: int_add.o cal_main.o
	gcc -o $@ int_add.o cal_main.o

%.o: %.c
	gcc -c $<

clean:
	rm -f cal_main cal_main.o int_add.o

all: cal_main

make clean을 입력해 이전파일을 지우고 make를 입력해 오브젝트 파일을 생성한다.

5) 변수생성

다음처럼 입력한다.

OBJS=int_add.o cal_main.o
TARGET=cal_main
OFLAGS=-o
CFLAGS=-c
CC=gcc

$(TARGET): $(OBJS)
	$(CC) $(OFLAGS) $@ $(OBJS)

%.o: %.c
	$(CC) $(CFLAGS) $<

clean:
	rm -f $(TARGET) $(OBJS)

all: $(TARGET)

make clean을 해 이전 파일을 지워주고 make를 입력해 파일을 생성한다.

[7] 현재 쓰고 있는 셸 검색하기

[1] work 디렉토리에 script디렉토리를 만들고 이동한다.
[2] echo $SHELL입력해 쓰고있는 SHELL을 검색한다. bash를 쓰고 있음을 알 수 있다.
[3] ls -l /bin/*sh를 입력하면 bin경로에 뒤에 sh가 붙는 경로를 출력한다. 위에서 3번째 줄에 bash가 있음을 볼 수 있다.
[4] 현 디렉토리에 script01을 생성한다.
[5] 다음처럼 입력한다.

#This is test script
var1="Hello, world!!"
echo $var1

[6] bash script01을 입력해 script01을 실행한다.

[8] chmod

- chmod: 파일들이나 디렉터리의 파일 시스템 모드들을 바꾼다. 그 모드들은 허가나 특별한 모드들을 포함한다.

chmod 775 script01을 입력해 script01의 권한을 바꾸어준다.

u(사용자, user) g(그룹, group) o(다른 사람들, others)
r(읽기) w(쓰기) x(실행) r(읽기) w(쓰기) x(실행) r(읽기) w(쓰기) x(실행)
4 2 1 4 2 1 4 2 1

- 바꾸려는 권한에 대해 표기된 숫자들을 더하면 된다.

- 만약, user에 읽기, 쓰기, 실행을 활성화 하고 싶으면 4+2+1을 더해 7을 입력하면 된다. 이와 같은 방식으로 ugo순으로 숫자를 입력하면 권한을 부여할 수 있다.

chmod -x -x -x script01을 입력해 ugo모두 실행권한을 없앤다.

- 빼기 기호를 이용할 수 있다. -x -x -x는 각각 사용자, 그룹, 다른 사람들쪽의 실행권을 없앤다. 비슷한 방법으로 +를 이용해 권한을 부여할 수 있다.

script01의 유저실행권을 없애서 실행을 하지 못한다.

[9] 셸스크립트 배포

#!/bin/bash
#This is test script
var1="Hello, world!!"
echo $var1

- 기존 코딩문에 #!/bin/bash를 추가한다.

- bash로 스크립트를 실행한다.

script01을 실행한다.

[10] bash

1) for문(1)

script02생성
다음과 같이 입력

#!/bin/bash

for i in 1 2 3
do
	echo $i
done

bash script02로 실행한다.

2) for문(2)

script03생
다음과 같이 입력

#!/bin/bash

for i in $(ls)
do
	echo $i
done

bash script03입력해 실행

3) for문(3)

script04 생성

#!/bin/bash

for i in {0..9}
do
	echo $i
done

bash script04로 실행하기

4) cp(파일 복사하기)

cp script04 script05를 입력해 script04를 script05로 복사한다.
다음처럼 수정한다.

#!/bin/bash

for i in {0..9}
do
	echo $i
done

script05를 실행한다.

[11] which, find

1) which

- 입력한 명령어의 실행 파일 경로를 찾아준다.

- path에 등록되어 있는 곳에서만 찾는다.

- which ls는 ls명령어의 실행 파일 경로를 찾는다.

2) find

- 파일과 디렉토리를 검색한다.

- find . -name script01 print ./work/script/script01 명령어를 입력했을때 path위치에 script01이 없어서 아무런 결과가 안떴다.

 

[12] cat

- 파일에 있는 내용을 출력해준다.

[13] head, tail

1) head

- 파일의 상단 부분을 보여준다.

2) tail

- 파일의 하단 부분을 보여준다.

[14] grep

- grep: 입력으로 전달된 파일에서 특정 문자열을 찾을 때 사용하는 명령어이다.

1) for가 있는 파일 찾기

- grep for *를 입력하면 for가 들어있는 파일을 찾아준다.

2) 1 2 3 이 있는 파일 찾기

- grep "1 2 3" *를 입력하면 1 2 3이 있는 파일을 찾아준다.

3) 파이프 라인

[1] etc경로로 이동한다.

- 파이프: 여러개의 명령어를 하나의 라인에서 연결시켜서 사용할 수 있게 해주는 명령어이다.

- 'ls -l | grep 2월'을 입력하면 날짜가 2월인 디렉토리들을 표시해준다.

- 'ls -l *conf'를 입력하면 마지막 부분이 conf인 디렉토리를 출력한다.

[15] ps

- ps: 현재 실행중인 프로세스 목록과 상태를 출력하여 보여주는 기능을 한다.

sample1을 편집기로 들어가고 ctrl z로 백그라운드로 변환한다.
다른 cmd를 띄어서 sample1을 들어갈려고 하면 다음과 같은 창이 뜰 것이다.
kill -9 5013을 입력해 vi sample1 실행을 죽인다.
ls -al을 입력해 .sample1.swp가 있는지 확인한다.
rm .sample1.swp를 읻력해 swp파일을 제거한다. 그러면 다른 cmd에서 vi sample1이 가능하다.

[16] awk

https://ko.wikipedia.org/wiki/AWK

 

AWK - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. AWK패러다임스크립트, 절차적, 데이터 드리븐[1]설계자앨프리드 에이호, 피터 와인버거, 브라이언 커니핸발표일1977년(46년 전)(1977)최근 버전IEEE Std 1003.1-2008 (POSIX

ko.wikipedia.org

awk: 유닉스에서 처음 개발된 일반 스크립트 언어이다.

which awk로 awk 실행경로를 확인하고 work 디렉토리에 awk_test디렉토리를 생성한다.
vi awkfile을 입력해 awkfile을 만든다.
복사후 줄 사이사이에 tab키 해주어야 한다.

James   Dean    176 1974/10/24  2345987
Matt    Daemon  181 1980/04/02  2328923
Kate    Moss    179 1975/05/21  2319472
Harrison Ford   183 1965/08/12  234518

awk '{print $0}' awkfile은 전체를 출력한다.
awk '{print $1}' awkfile은 첫번째 칼럼을 출력한다.
awk '{print $2}' awkfile은 번째 칼럼을 출력한다.
awk '/Moss/' awkfile은 Moss가 들어가 있는 열을 출력한다.
awk '/at/' awkfile은 글자 중간에 at가 들어가 있는 열을 출력한다.
awk '/at/{print "\tGood Morning, " $1, $2}' awkfile은 "\tGood Morning"안에 있는 것을 그대로 찍는다.
awk '{printf "The name is %-20s Height is %4d \n", $1 " " $2, $3}' awkfile
awk '{print NR, $0}' awkfile에서 NR은 numbering을 의미한다.

[17] wc

wc: 특정 파일내에서 존재하는 바이트(Bytes)수, 단어(Words)수, 행(Lines)수를 카운트하여 화면에 출력해 주는 명령어이다.

script경로로 이동한 다음 wc script04를 입력해 행, 단어수,문자수를 출력한다.
wc -l script04를 입력하면 행의 개수만 출력한다.

[18] l-node

https://inpa.tistory.com/entry/LINUX-%F0%9F%93%9A-%ED%95%98%EB%93%9C-%EB%A7%81%ED%81%AChard-link-%EC%8B%AC%EB%B3%BC%EB%A6%AD-%EB%A7%81%ED%81%ACsymbolic-link-%EC%95%84%EC%9D%B4%EB%85%B8%EB%93%9Cinode

 

🐧 리눅스 파일 링크 (하드 링크 / 심볼릭 링크 / inode)

윈도우 바로가기 vs 리눅스 링크 윈도우를 사용하다 보면 어떤 파일을 실행할 때, 바로가기를 통해 접근해본 경험을 해 봤을 것이다. 리눅스 역시 윈도우의 바로가기와 비슷한 기능을 제공하는

inpa.tistory.com

- inode: 유닉스 계통 파일 시스템에서 사용하는 자료구조이다.

-Hard Link: 원본 파일의 inode를 하드 링크 파일도 같이 사용하게 되어, 하드링크가 걸린 파일을 이동시켜도 계속 원본 파일을 가리키게 된다.
-Soft Link: 원본 파일의 inode와는 별개로 새로운 inode를 만들고 포인터는 원본파일을 가리킨다. 소프트 링크가 걸린 파일을 이동시키면 링크는 원본파일을 가리키지 못한다. 후에 다시 원위치로 되돌리면 다시 원본파일을 가리킨다.

1) softlink 예제

ln -s(soft link) script/script03 (original file) script03_link을 입력해 script03에 대한 softlink를 만든다.
vi script03_link를 입력해 편집기로 연다.
기존 script03처럼 뜬다.
마지막에 '#주석'을 추가시켜본다.
돌아와서 기존 script03을 열어본다.
script03_link에서 수정한 내용이 그대로 있다.
rm script/script03으로 원본 파일을 삭제시 script03_link는 깨진 링크가 된다.
rm script03_link로 삭제 시켰다.

[19] TAR

TAR: 여러 파일을하나로 묷는다. Tape Archive의 약자이고  zip하고 다르다.

1) script디렉토리 묶기

tar cvf script.tar script로 script디렉토리를 script.tar로 묶는다.
rm -R script로 기존 디렉토리를 제거한다.
제거된 거을 확인할 수 있다.

2) 묶은 것 풀기

tar xvf script.tar을 입력해 묶인 script디렉토리를 푼다.
풀린 것을 볼 수 있다.

[20] gzip

gzip: 파일을 압축해준다.

1) 압축하기

gzip -5v script.tar을 입력해 script.tar을 압축한다. 그러면 script.tar이 없어지고 script.tar.gz가 생성된다.

- 코드에서 5같은 숫자는 압축률로 9가 압축률이 높지만 속도가 느리다.

- v는 verbose이다.

2) 압축해제

gzip -dv script.tar.gz를 입력해 압축된 파일을 푼다. 그러면 script.tar.gz가 없어지고 script.tar이 생긴다.

3) 압축파일과 압축된 파일 둘다 남기기

tar zcvf script.tar.gz script를 입력해 압축전 파일과 압축후 파일을 둘다 남긴다.
rm -R script를 입력해 script디렉토리를 없앤다.
tar zxvf script.tar.gz를 입력해 script.tar.gz를 압축해제한다. 해제는 되지만 기존 gz파일은 남아있는다.