본문 바로가기

etc

[Shell] - 기타/파일찾기/프로세스/스크립트/Makefile

내가 잊었거나 새로 알게된 것을 적음

 

 

==========

커맨드 라인

Ctrl+A : 처음

Ctrl+E : 끝

 

Ctrl+F : 앞으로 (오른쪽방향키)

Ctrl+B : 뒤로 (왼쪽방향키)

 

Ctrl+L : 현재 라인 제외 clear

 

Ctrl+K : 뒤 자르기

Ctrl+U : 앞 자르기

Ctrl+Y : 붙여넣기

 

Ctrl+C : 현재 행 취소

Ctrl+D : 어떠한 입력 그만

 

history

history : 보기

!정수 : 해당 history 실행

!! : 바로 이전 history 실행

!?문자열? : 문자열 찾아 실행

Ctrl+R : history에서 문자열 찾음

 

 

환경 변수 PATH

PATH=$PATH:$HOME/c ; export PATH

>>> PATH환경변수에 $HOME/c 추가하기

>>> .bashrc 에 넣으면 좋음

 

 

메타문자

| (파이프) : 왼쪽의 출력을 오른쪽의 입력으로

cat /etc/passwd | sort | less 

 

;(세미콜론) : 해당 명령어 연속 사용

date; who

 

 

man 활용

man 1 : 사용자 명령어 검색 ( grep 명령어 )

man 2 : 운영체제 상호작용 라이브러리 검색 ( write() 함수 )

man 3 : 표준 std 검색 ( printf() 함수 )

 

man -k : 짧은 man pages 출력

 

vim 중에 man 활용하기

1. 해당 함수위에 Shift + K 누르기

 >>> strcpy작성 중에 헷갈리면 strcpy를 커서로 옮기고 Shift + K

2. 모드 전환 후 :!man 사용하기
 >>> :! man 3 -k strcpy

 

 

 

 

==========

vim 추가

i, a, o : 추가

dd : 삭제

5dd : 현재부터 현재+4까지  5행 삭제

 

H : 화면 맨 위

M : 화면 중간

L : 화면 맨 아래

 

yy : 현재줄 복사

3yy : 현재~현재+2까지  3행 복사

 

p : 현재 행 아래로 붙여넣기

 

u : 바로 전에 수행한 명령 취소

 

/name : 문자열 찾기 -> n/N으로 이동

 

:set nu : 행번호 보여주기

:set nonu : 취소

 

:%s/str/rep/g : 모든 str를 rep로 바꿈

 

==========

파일시스템 명령

chmod : 파일이나 디렉터리 권한 변경

chmod 777 test.txt

chmod [ugoa][-+][rwx] test.txt

chmod -R o-w $HOME/myapps : -R로 내부까지 재귀로

 

umask 비트 : 기본권한 설정 (해당 비트를 빼는 연산임)

umask 777 : 만든 파일은 000이 됨 

umask 002 : 만든 파일은 775가 됨 

 

chown [바꿀사용자] [파일명]

chown [바꿀사용자:그룹] [파일명]

마찬가지로 -R옵션은 재귀

 

메타문자

* : 개수에 상관없이 문자 대신

touch a apple banana

ls a*

>>> a apple 출력

 

? : 문자 하나를 대신

ls a???e

>>> apple 출력

 

[...] : 하나 고름

ls [abc]*

>>> a apple banana 출력

ls [0-9] 가능

 

< : 파일의 내용을 입력으로 보냄 (stdin < txt)

> : 표준 출력을 파일로 전환 (stdout)

2> : 표준 오류를 파일로 전환 (stderr)

&> : 표준 출력과 표준 오류를 파일로 전환

>> : 출력을 파일로 전환하되, 파일의 끝에 추가 (add)

<< [구분자] : 구분자가 나올 때 까지 입력을 키보드로 받음 (stdin)

 

중괄호 사용

touch memo{1,2,3,4,5}; ls

>>> memo1 memo2 memo3 memo4 memo5

 

여기에 점 개 사용

touch memo{1..5}; ls

>>> memo1 memo2 memo3 memo4 memo5

 

연속해서 사용

touch {a, b, c}-{1, 2}; ls

>>> a-1 a-2 b-1 b-2 c-1 c-2

cf) 삭제도 마찬가지로 사용하면 됨

 

ln -s [원본파일] [링크파일]

>>> 원본파일 == 링크파일

>>> 포인터파일만듬

>>> ls -l 로 확인하면 l로 나옴 (디렉터리는 d, 파일은 -)

 

ls 옵션

-t : 수정 순서

-F : 파일 종류 알려줌

-a : 숨긴 파일

--hide= : 해당은 숨김 >> ls --hide=g* 

-d : 해당 정보 보기 >>> 담긴파일을 보는게 아님

 >>> ls -ld ~ 하면 홈디렉터리 내부를 보는 게 아니라 홈디렉터리 정보를 봄

-R : 내부까지 싹다

-S : 크기 별로 출력

 

mkdir -p 로 깊어지는 서브 디렉터리 만듬

 

mv/cp/rm

mv : 이동 및 이름변경( 같은디렉터리 일 때 )

cp -r 재귀: -a : 권한 및 수정날짜 그대로 복붙

rm -r 재귀 : -f 강제

 

 

 

==========

vim 추가

w : 다음 단어

b : 이전 단어

 

0 : 현재 행 시작 위치

$ : 현재 행의 끝위치

 

dw : 현재 커서 위치의 단어 삭제 (delete word)

 

ZZ : 저장후 종료

 

u : 변경 취소 (ctrl + z)

Ctrl + R : 변경 취소를 취소 (shift + ctrl + z)

 

Ctrl + f : 한 페이지 넘기기 (front)

Ctrl + b : 한 페이지 올리기 (back)

Ctrl + d : 반 페이지 넘기기 (down)

Ctrl + u : 반 페이지 올리기 (up)

 

gg:  1행으로 이동

1G : 1행으로 이동

nG : n행으로 이동

G : 파일 마지막행으로 이동

 

 

/str1.*str2 : str1에서 str2로 거리를 두는 문자열을 찾음

 

vimtutor : 튜토리얼

 

 

==========

파일찾기

기본 : locate, find, grep

 

locate [문자열] : 이 문자열이 포함된 파일의 경로 출력

-> 데이터베이스(updatedb)를 검색하여 파일의 위치를 찾아냄

-> 그 결과 root권한이 없을 경우, 또는 데이터베이스안에 정보가 없을 경우 찾지 못하는 경우도 존재

-> 즉, 새로 파일을 만들고 실행하면 updatedb가 최신상태가 아니라서 sudo updatedb해야 함

locate -i : 대소문자 구분안함

 

 

 

find : 실시간으로 파일시스템 검색

기본 : find [경로] : 해당 경로의 모든 내용 검색

 

옵션

-ls : 해당 경로의 모든 내용을 ls로 검색

 

-name [파일명] : 해당 경로에서 파일명에 해당하는 내용 검색

-iname [파일명] : 해당 경로에서 파일명에 해당하는 내용을 대소문자 구분없이 검색

-> * . [] 사용가능

만약 find . -name ".txt" 를 하면 .txt만 찾고 a.txt도 안찾음 -> *같은 메타문자를 잘 섞어야 함

find . -name "*.txt"

 

-size [+-][정수][KMG] : 파일 크기로 찾음

find /bigdata -size +500M -size -5G -exec du -sh {} \;

 

-user [소유자] : 소유자 파일

-group [그룹명] : 그룹 파일

find /home -user malbong -or -user joe -ls

 

-perm [권한] : r:4 w:2 x:1 (setuid, setgid, stickybit는 따로 4자리수가 있을 것)

find /bin -perm 755 -ls : 정확히 755이어야 함

find /bin -perm -222 -ls : 적어도 222가 다 켜져있을 때

find /bin -perm +222 -ls : 어느 하나라도 2가 켜져있을 때

find /bin -perm -002 -ls : other가 2가 켜진 것, 나머진 상관없음

 

-[acm][min/time] [+-][시간]

a: 수정되지 않음, c: 소유권이나 권한 변경, m: 수정됨

min : 분, time : 날짜

+ 이상, - 이내

find /var/ftp -atime +300 : 300일 이상 수정되지 않은 것을 /var/ftp 에서 찾음

find /etc mmin -30 : 30분 전에 값 수정된 것을 /etc에서 찾음

 

-or -not -and: 사용가능

find /var/all -user joe -and -size +1M -ls

 

-exec 혹은 -ok

find [options...] -exec command {} \;   : command 바로 실행, 확인 없음

find [options...] -ok command {} \;   : command 실행하기 전 확인 받음

cf) {}는 찾은 값이 들어감

>>> find /etc -iname iptables -exec echo "I Found {}" \;

>>> find /var/allusers -user malbong -ok mv {} /tmp/malbong/ \;

cf) \; 필수

 

 

grep : 해당 문자열 찾기

grep [문자열] [파일명or입력값]

-i : 대소문자 구별 X

-v : 해당 문자열이 없는 행 출력

-rl : 해당 문자열이 담긴 파일 출력 (r은 정확히는 서브디렉터리까지, 재귀)

 

grep -i desktop /etc/services

grep -iv tcp /etc/services

 

파이프 처리

입력값을 파이프의 출력으로 받는 것임

cat a.txt | grep hello

grep hello << EOF

 

 

 

==========

프로세스 관리

ps

ps -ef

 

ps ax

ps axu

 

ps -eo [format] 

ps -eo user,pid,vsz,rss,%cpu --sort=-%cpu;

 

 

 

top

여러 키가 존재, top을 활성화 시킨 상태로 h를 눌러 도움말 보기...

NI는 나이스 번호

 

 

 

 

백그라운드 명령

명령 + & : 백그라운드로 실행

[작업번호] PID 남김

 

jobs : 현재 백그라운드로 실행되고 있는 명령확인

-l 옵션이랑 같이써야 PID가 보임

 

Ctrl + Z : 현재 작업을 중지시키고 백그라운드로 옮겨놓음

jobs -l 로 확인 가능

 

fg: 포그라운드로 복귀시키기

fg % : 가장 최근에 백그라운드로 들어간 명령을 불러옴

fg %[작업번호] 

fg %문자열

fg %-- : 가장 최근에 중지된 작업 바로 이전에 중지된 작업

 

bg: 백그라운드로 다시 실행시키기

fg와 동일 >> bg %5

 

 

 

 

프로세스 죽이기

kill [신호/번호] [PID]

killall [신호/번호] [PNAME]

 

 

-9 : 죽임

-15: 중단

나머지는 필요하면 찾아라

 

kill 10432 : 디폴트 신호는 15이므로 아래와 같음

kill -15 10432 

kill -SIGKILL 10432 : 10432를 죽임, 아래와 같음

kill -9 10432 

 

killall -9 testme

 

 

nice / renice : 우선순위 설정

실행할 명령에 우선순위 주는 것은 nice

실행중인 것을 변경할 때는 renice

 

-20 ~ 19 사이의 nice값을 가짐

낮을 수록 CPU접근 높음

일반사용자는 음수 X, 높이기밖에 안됨, 자신 프로세스만 접근가능

루트는 모두 가능

 

nice +5 updatedb &

renice -n -5 20284

 

 

 

 

==========

셸 스크립트

# : 주석

 

변수초기화

-> 변수명=값

-> 공백없음에 유의

-> PI=3.141592

 

명령의 결과를 변수에 넣기

-> MYDATE=$(date)      (괄호 없으면 명령이 아닌 변수참조로 인식 $date)

-> MYDATE=`date`

-> NUM_FILES=$(/bin/ls | wc -l)

 

다른 변수를 담기

-> MYDATE2=$MYDATE

 

$는 값 참조임

-> MYDATE는 그냥 변수

-> $MYDATE는 변수의 값 참조

 

메타 문자로 표현하지 않고 문자그대로를 사용하려면

백슬레시 or 문자열전체를 ' '로 묶음

-> echo \$HOME

-> echo '$HOME'

-> echo "$HOME ***"

-> 큰따옴표는 *만 문자그대로 표현해줌...

 

커맨드라인인자

$n : n번째 파라미터 ($0은 스크립트의 경로임)

-> $0 $1 $2 ... $n

$# : 파라미터 개수 (경로 제외)

$@ : 입력된 인수 전체

$? : 마지막으로 실행된 명령의 종료 상태 (ex. main함수의 return 0)

 

read함수로 입력받기

-> read -p "input: " n1 n2 n3

-> echo "$n1, $n2, $n3"

 

파라미터 확장

${변수:-값} : 변수가 없으면 '값'으로 먹음 (1회용)

-> echo "${THIS:-Not Set}"

${변수#패턴} : 패턴을 앞부터 비교해 가장 짧은 것을 잘라냄

${변수##패턴} : 패턴을 앞부터 비교해 가장 긴 것을 잘라냄

${변수%패턴} : 패턴을 뒤부터 비교해 가장 짧은 것을 잘라냄

${변수%%패턴} : 패턴을 뒤부터 비교해 가장 긴 것을 잘라냄

-> MYFILENAME=/home/digby/myfile.txt

-> FILE=${MYFILENAME##*/}  -> myfile.txt

-> DIR=${MYFILENAME%/*} -> /home/digby

-> NAME=${FILE%.*} -> myfile

-> EXTENSION=${FILE##*.} -> txt

 

배시는 변수를 declare로 선언하지 않는다면 글자들의 집합으로 봄 (타입 미지정)

산술 연산을 하기 위해서는 변수를 정수로 변환해야 함 (let, expr, bc)

-> NUM=1024

-> let RET=$NUM/16

-> RET=`expr $NUM / 16`

-> RET=`echo $NUM / 16 | bc`

 

변수 증감식 사용

-> N=0

-> $((++N))

-> $((N++))

 

if ... then ... fi 구문

VARIABLE=1

if [ $VARIABLE -eq 1 ] ; then

    echo "The variable is 1"

elif [ $VARIABLE -eq 2 ] ; then

    echo "The variable is 2"

else 

    echo "The variable is anything"

fi

 

수식판단용 연산자

-d : 디렉터리?

-e : 존재하나? (same as -a)

-f : 일반 파일? (디렉터리, 소켓, 파이프, 링크, 장치파일이 아닌 파일)

-r : readable?

-w : writable?

-x : excutable?

expr1 -a expr2 : 둘다 참? (and)

expr1 -o expr2 : 둘 중 하나 참? (or)

var1 = var2 : 비교 (특히 문자열)

var1 -eq var2 : 비교 (특히 정수)

var1 -ge var2  : var1이 var2보다 크거나 같은가

var1 -gt var2  : var1이 var2보다 큰가

var1 -le var2  : var1이 var2보다 작거나 같은가

var1 -lt var2  : var1이 var2보다 작은가

var1 != var2 : not eq

var1 -ne var2 : not eq

 

조건 검사와 || &&

[ 조건검사 ] || 동작

-> 조건이 만족되면 동작을하지 않음

-> [ -d "$dirname" ] || mkdir "$dirname"

-> short circuit (A참 || B판단x)

[ 조건검사 ] && 동작

-> 조건이 만족되면 동작을 함

-> [ $# -ge 3 ] && echo "There are at least 3..."

-> short circuit (A참 && B판단o)

[ 조건검사 ] && 동작1 || 동작2

-> 조건이 참이면 동작1 실행 -> 동작2 실행 X

-> 조건이 거짓이면 동작1 실행X -> 동작2 실행

->[ -e $dirname ] && echo $dirname already exit || mkdir $dirname

-> short circuit ( (A&&B) || C )

 

case ... esac 구문

case 변수 in

     값1)

         실행문 ;;

     값2)

         실행문 ;;

     *)

         실행문 ;;

esac

->

case `date +%a` in

    "Mon" | "Tue")

        echo "Today is monday or tuesday" ;;

    *)

        echo "Today is not monday and tuesday" ;;

esac

->

case $VAR in

    "var1")

        echo "var1" ;;

    *)

        echo "not var1" ;;

esac

 

for ... do ... done 구문

for 변수 in 리스트

do

    실행문

done

-> 일반 예시

for NAME in John Paul Ringo George

do

    echo $NAME is my favorite Beatle

done

-> ; do 활용

for FILE in `/bin/ls` ; do

    echo $FILE

done

-> C 개발자를 위한 for문...

LIMIT=10

for((a=1; a <= LIMIT ; a++)) ; do

    echo $a

done

 

while ... do ... done (조건이 참인 동안 실행)

until ... do ... done (조건이 참일 때까지 실행)

-> while 문

while [ 조건 ]

do

    실행문

done

-> untile 문

until [ 조건 ]

do

    실행문

done

-> ; do 활용가능

N=0

while [$N -lt 10] ; do

    echo $N

    let N=$N+1

done

 

grep (일반 정규식 파서)

grep <찾는 문자열(혹은 정규표현식)> <파일이나 입력>

-> env | grep ^HO

-> ^는 시작 메타 문자

-> $는 끝 메타 문자

 

cut (일정 영역의 텍스트행 제거)

-> grep /home /etc/passwd | cut -d':' -f6

-> /etc/passwd에서 /home을 찾아내고 그것을 딜리미터:으로 나눈 후 6번째 field출력

-> 해당 행에 딜리미터가 없어서 자르지 못했으면 그냥 그대로 출력

 

tr (문자 변환 / 삭제)

-> FOO="Mixed UppEr ANd oLWeR cAse"

-> echo $FOO | tr [A-Z] [a-z]

-> mixed upper and lower case 출력

->

-> for file in * ; do

->    f=`echo $file | tr [:blank:] [_]`

->    [ "$file" = "$f" ] || mv "$file" "$f"

-> done

->

-> echo $var | tr '_' ' '

 

sed (스트림 에디터)

sed -n '/home/p' /etc/passwd

sed 's/Mac/Linux/g' somefile.txt > fixed_file.txt

cat somefile.txt | sed 's/ *$//' > fixed_file.txt

 

grep cut tr sed bc 등 더 찾아봐야 할듯

 

 

==========

Makefile make

https://velog.io/@hidaehyunlee/Makefile-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

Makefile 만들기

Makefile을 사용하는 이유는 위와 같은 복잡한 과정을 생략할 수 있어서이기도 하지만, Makefile이 제공하는 강력한 기능 중 하나인 Incremental build 를 사용하기 위해서다.

velog.io

 

CC = 컴파일러  // gcc 사용

CFLAGS = 옵션 // 옵션은 선택

 

SRCS = 소스파일명 // .o파일로 만들 .c 파일을 나열하면 됨

OBJS = $(SRCS:.c=.o) // OBJS가 판단될때 SRCS의 .c파일을 .o로 치환함

 

TARGET = 만들실행파일명

 

$(TARGET) : $(OBJS)

            $(CC) $(CFLAGS) -o $@ $^

//변수 사용은 $(변수)로함

// $(TARGET)을 만들기 위해서 $(OBJS)가 필요함 (의존성 나열)

// $(OBJS)가 없으면 OBJS로 가서 만듬

// 즉, 의존성 나열로 순서를 정하는 것

//$@은 : 를 기준으로 왼쪽, $^은 오른쪽

//$@는 $(TARGET)이 되고 $^은 $(OBJS)가 됨

 

all : $(TARGET)

// make all 하면은 의존성으로 인해 $(TARGET)이 만들어져야하고

// $(TARGET)이 만들어 지려면 $(OBJS)가 만들어져야 함

// 즉, 이러한 순서로 인해 make all하면 실행파일이 만들어짐

clean :

         rm -f $(OBJS)

// make clean

// OBJS파일을 모두 지움

fclean : clean

         rm -f $(TARGET)

// make fclean

// clean을 실행하고 TARGET을 지움

// 그래서 make fclean하면 의존성 때문에 clean도 실행되는 것

re : fclean all

// 의존성으로 re가 실행되기전 fclean이 실행되어야 하고 그 이후 all이 실행되야 함

// fclean은 clean을 부름 -> 다 지움

// all은 TARGET을 필요함 -> 실행 파일을 만듦

 

'etc' 카테고리의 다른 글

42seoul - la piscine 후기 (울타리, 개인적인 생각)  (3) 2020.08.05
집중 & 시간  (0) 2020.06.03
Google Service는 왜 SHA-1 지문이 필요한가?  (0) 2020.02.27