자주 쓰진 않지만, 인라인 커맨드를 사용하면서 알아두면 유용한 커서이동, 삭제 편집키를 정리한다.

 

1. 주요 커서 이동 키

ESC 후 b: 커서를 왼쪽으로 한 단어 이동(backward)

ESC 후 f: 커서를 오른쪽으로 한 단어 이동(forward)

Ctrl + a: 맨 왼쪽으로 이동

Ctrl + e: 맨 오른쪽으로 이동

 

2. 주요 삭제키

ESC 후 Backspace: 커서 왼쪽 한 단어 삭제

ESC 후 d: 커서 오른쪽 한 단어 삭제

Ctrl + u: 행 전체 삭제

Ctrl + y: 삭제 취소

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

스크립트 실행시 "-a" 와 같이 옵션을 줄 때, 이를 getopts로 받는 방법 예시

 

test.sh

#!/bin/bash

while getopts abc: arguments 2> /dev/null # 에러출력을 감춘다. "c:"는 c 옵션에는 인자가 필수라는 의미.
do
        case "$arguments" in
                "a")
                        echo "-a option used.";
                        ;;
                "b")
                 	echo "-b option used.";
                        ;;
                "c")
                        echo "-c option used.";
                        echo "OPTARG ===> $OPTARG."; # OPTARG 특수변수는 옵션의 인자로 넘어온 값을 담고있다.
                        ;;
                "?")
                        echo "Usage : opt4 [-ab] [-c argument]";
                        exit 1;
                        ;;
        esac
done
echo "the number of argument is $((OPTIND-1)) ..." # OPTIND 특수변수는 명령줄의 스크립트명(여기서는 ./test.sh)도 포함한 전체 인자의 갯수이다.
# ((OPTIND-1)) 은 산술연산을 의미하고, 이를 다시 변수참조로 받기 위해 $를 앞에 붙여준 듯.

 

./test.sh -a -b -c centos 실행결과

-a option used.
-b option used.
-c option used.
OPTARG ===> centos.
the number of argument is 4 ...

 

./test.sh -abc centos 실행결과

-a option used.
-b option used.
-c option used.
OPTARG ===> centos.
the number of argument is 2 ...

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

정확히는 bash 스크립트 디버깅 방법이다.

 

1. bash -n 스크립트파일

스크립트에 문법적 오류가 있는지 확인할 때 사용한다. 스크립트를 해석은 하지만, 실행하지는 않는다.

스크립트에 문법 오류가 있는 경우, 에러 내용을 출력해주고, 문법 오류가 없는 경우 아무런 메시지도 출력하지 않는다.

 

2. bash -x 스크립트파일

스크립트 전체를 디버깅하기 위해 일반적으로 사용되는 방법이다.

순서: 변수 치환 -> 실행되는 스크립트 각 라인 출력 -> 스크립트 실행결과 출력

실행되는 스크립트 각 라인 출력시 맨 앞에 "+" 기호가 붙는다.

 

3. 스크립트 내 set -x, set +x 사용

스크립트 중 일부분만 디버깅하기 위해 일반적으로 사용되는 방법이다.

스크립트 내 디버깅을 시작하고자 하는 부분에 set -x 를, 디버깅을 종료하고자 하는 부분에 set +x 를 삽입하고 일반적인 방법으로 스크립트를 실행하면 된다.

 

예시)

test.sh

#!/bin/bash

name="linux"
if [[ $name == "centos" ]]
then
        printf "Hello $name\n"
fi

set -x # 디버깅 시작지점
declare -i num=1
while (( num < 5 ))
do
        let num+=1
done
set +x # 디버깅 종료지점

printf "Total : %d\n" $num
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

조건문 사용시 정수 비교표현식을 많이 사용하는데, 이때 let과 test의 사용방법을 알아본다.

 

let은 (())와 같으며

test는 [[]]와 같다.

 

1. 스크립트 작성

test.sh

#!/bin/bash
x=5
y=7

(( x < y ))
echo $?

[[ x -lt y ]]
echo $?

 

2. 스크립트 실행

./test.sh

0
0

 

3. 정리

정수 비교연산시 let을 사용시에는 비교연산자로 기호(<, >, <=, >=, ==)를 사용하며,

test를 사용시에는 비교연산자로 비교문자(-lt, -gt, -le, -gt, -eq)를 사용하면 된다.

(이렇게 정리하는게 속편하다)

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

조건문을 사용할 때 문자열 비교 표현식 결과를 판단하기 위해서 싱글브라켓과 더블브라켓을 사용하는데, 그 차이를 정리한다.

참고로, 브라켓을 사용할 때는 시작 브라켓 다음에 반드시 공백이 있어야 한다. (문자열 비교시)싱글브라켓은 test와 같은 기능이다. "=" 와 "==" 는 둘다 동일비교이며, bash 버전에 따라 "=" 를 지원하지 않는다고 한다.(걍 문자열 비교는 무조건 == 를 쓰자) 표현식 판단결과가 0이면 true이며, 1이면 false이다.

참고로, "-eq" 는 문자열 비교시가 아니라 숫자 비교를 test를 사용하여 비교할 때 쓰는 비교문이다.

 

1. 테스트 스크립트

test.sh

#!/bin/bash
name=root

# 1. 정확한 문자열 매칭 테스트
# test, 싱글브라켓, 더블브라켓 모두 동일하다.
test $name = root
echo '$name = root >>> '$?

test $name == root
echo '$name == root >>> '$?

[ $name = root ]
echo '[ $name = root ] >>> '$?

[ $name == root ]
echo '[ $name == root ] >>> '$?

[[ $name = root ]]
echo '[[ $name = root ]] >>> '$?

[[ $name == root ]]
echo '[[ $name == root ]] >>> '$?



# 2. 패턴 매칭 테스트
# 싱글브라켓, test는 패턴매칭이 안된다.
# 더블브라켓은 패턴매칭이 된다.
test $name = [Rr]???
echo 'test $name = [Rr]??? >>> '$?

test $name == [Rr]???
echo 'test $name == [Rr]??? >>> '$?

[ $name = [Rr]??? ]
echo '[ $name = [Rr]??? ] >>> '$?

[ $name == [Rr]??? ]
echo '[ $name == [Rr]??? ] >>> '$?

[[ $name = [Rr]??? ]]
echo '[[ $name = [Rr]??? ]] >>> '$?

[[ $name == [Rr]??? ]]
echo '[[ $name == [Rr]??? ]] >>> '$?

 

2. 실행결과

./test.sh

$name = root >>> 0
$name == root >>> 0
[ $name = root ] >>> 0
[ $name == root ] >>> 0
[[ $name = root ]] >>> 0
[[ $name == root ]] >>> 0
test $name = [Rr]??? >>> 1
test $name == [Rr]??? >>> 1
[ $name = [Rr]??? ] >>> 1
[ $name == [Rr]??? ] >>> 1
[[ $name = [Rr]??? ]] >>> 0
[[ $name == [Rr]??? ]] >>> 0

 

3. 정리

test 명령어와 싱글브라켓은 기능이 동일하며, 더블브라켓은 패턴매칭까지 지원한다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

# 명령어 표현식

n=`date` # date 명령어의 실행 결과를 n 변수에 저장

n=$(date) # date 명령어의 실행 결과를 n 변수에 저장(위와 동일)

 

# 정수형 연산 표현식

declare -i n

n=10+20 # 또는 n="10 + 20" 띄어쓰기도 가능

 

# 정수현 연산 표현식

let n=10+20 # 또는 n="10 + 20" 띄어쓰기도 가능

 

# 정수현 연산 표현식

((n=10+20)) # let n=10+20 과 동일. 단, 띄어쓰기 불가능

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

모든 위치파라미터를 저장한다는 점에서는 동일하나, 쌍따옴표(")로 둘러쌓이면 다른 의미를 갖는다.

기억하기 쉽게 설명하자면, "$*"는 모든 파라미터를 한개의 문자열로 퉁치고, "$@"는 인용문자(', ")의 의미를 살려 파라미터를 배열로 취급한다.

다음의 예제를 실행해보면 쉽게 알 수 있다.

 

코드

all.sh

#!/bin/bash
set "hong gildong" jangbogo janggilsan
declare -i cnt=0
for i in $* # 이 부분을 $*, $@, "$*", "$#" 네가지로 변경하며 실행하면 차이를 알 수 있음
do
        echo $cnt
        echo $i
        cnt+=1
done

 

실행

./all.sh

 

 

결과

$*, $@ 인 경우

0
hong
1
gildong
2
jangbogo
3
janggilsan

 

"$*" 인 경우

0
hong gildong jangbogo janggilsan

 

"$@" 인 경우

0
hong gildong
1
jangbogo
2
janggilsa
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

리눅스 쉘스크립트는 기본적으로 변수를 문자열로 취급하기 때문에, 정수형 산술연산(-, +, *, /, % 등)을 하기 위해서는 아래의 네가지 방법을 사용할 수 있다.

 

1. 선언시 정수형으로 선언

declare -i 변수명

위와 같이 변수 선언시, 해당 변수는 정수로 취급되며, 변수에 문자열을 넣으면 0이 된다. 기본값은 0이다.

이렇게 선언된 변수는 바로 산술연산이 가능하다.(산술식의 결과를 대입할 수도 있고, 변수끼리 산술연산도 가능하다)

 

e.g.

declare -i num

num=10+10

echo $num # 20이 출력됨

 

2. let 명령어 사용

declare -i 로 선언된 변수가 아니더라도,

let 산술연산 대입식

을 사용하여 산술연산이 가능하다.

 

e.g.

num=10

let num=num+10 # let "num = num + 10" 쌍따옴표로 묶어도 연산이 되며, 띄어쓰기도 넣을 수 있다.

echo $num # 20이 출력됨

 

3. 쌍괄호 사용

쌍괄호로 산술연산식을 감싸면 let 명령어를 사용한 것과 동일하다.

 

e.g.

num=10

((num=num+10)) # ((num = num + 10)) 띄어쓰기도 넣을 수 있다.

echo $num # 20이 출력됨

 

4. expr 명령어 사용

expr 값 연산자 값 or expr $[값 연산자 값]

 

e.g.

expr 10 + 20 # 30

expr 2 \* 3 # 6. *연산자를 와일드카드를 의미하므로 escape 해줘야 한다.

expr $[2 * 3] # expr $[2*3], echo $[2*3], echo $[2 * 3] 과 동일. $[] 로 감싸면 escape 할 필요 없다.

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

입력을 필터링하고, 필터링된 데이터를 원하는 포멧으로 출력하기 위한 리눅스 빌트인 프로그램(명령어)은 주요하게 3가지가 있다.

grep, sed, awk

 

grep은 보통 입력에서 원하는 패턴 또는 문자열이 포함된(또는 포함되지 않은) 라인만 출력하기 위해 사용된다.

이번 글에서는 sed와 awk의 주요 명령어 사용형식에 대해서 정리한다.

 

1. sed

패턴에 일치(또는 라인번호에 일치)하는 라인에 대해 어떤 처리(치환, 삭제) 후 출력한다.

 

치환 : sed '[/패턴 or 라인범위/]s/pattern1/pattern2/g' 대상파일(pattern2를 빈값으로 하면 일치하는 텍스트만 삭제되는 효과)

일치 라인만 출력 : sed -n '/패턴 or 라인범위/p' 대상파일

삭제후 나머지 라인 출력 : sed '/패턴 or 라인범위/d' 대상파일

 

2. awk

*** 잘쓰면 개유용함***

패턴이나 조건에 일치하는 라인에 대해 (공백 또는 탭을 기준으로-default)각 필드를 포멧팅 하여 출력한다. 프로그래밍적 문법과 연산도 지원하기 때문에 복잡한 데이터 가공까지 가능하다.

 

awk '[/패턴/ or 필드조건][{printf "포멧지정자 포함 텍스트",$필드위치변수 > "출력파일"}]' 대상파일

awk -f awk명령어파일 대상파일

awk 'BEGIN{awk내장함수 or 명령어 | getline item;awk처리액션...}[/패턴/ or 필드조건]{레코드별 액션}END{모든행 처리 후 액션}'

*BEGIN만 사용하면 입력파일 없이 액션 부분에 쉘 명령어를 사용하여 원하는 출력을 만들어낼 수 있다.

*awk 빌트인 변수와 빌트인 함수를 잘 사용하면 강려크하다.

 

3. 유용한 awk 빌트인 함수

3.1. 문자열함수

sub, gsub, index, length, substr, match, split, sprint, toupper, tolower

3.2. 수학함수

int, log, rand, srand, sin, cos

3.3. 시간함수

systime, strftime

3.4. 입력읽기 함수

getline: 파이프라인(|) 뒤에서 앞 명령어로 출력된 라인을 입력받거나, 장치(파일)로부터 앞에서 입력리다이렉션(<)을 받는다.

반환값은 입력된 라인이 존재하면 1, 존재하지 않으면 0, 에러시 -1 이다.(falsy 값이므로 루프나 조건문에 사용가능)

e.g. "date" | getline d; getline data < "/dev/tty"; getline data < "/etc/passwd"

3.5. 리눅스 명령어 실행함수

system

 

4. 유용한 awk 빌트인 변수

NF: 현재 레코드 필드 갯수

 

NR: 현재 레코드 번호(1부터 시작)

FNR: 파일의 전체 레코드 갯수

 

FS: 입력필드 분리자(기본값 공백)

OFS: 출력필드 분리자(기본값 공백)

 

RS: 입력레코드 분리자(기본값 newline: \n)

ORS: 출력레코드 분리자(기본값 newline: \n)

 

RLENGTH: match 함수에 의해 매칭된 문자열 길이

RSTART: match 함수에 의해 매칭된 문자열의 offset(매칭시작인덱스)

 

IGNORECASE: 정규표현식과 문자 비교처리시 대소문자 구분여부(0: 구분안함, 1: 구분함. 기본값 1)

ARGC: 인자갯수

ARGV: 인자배열

 

 

 

e.g. 특정 필드의 값이 특정 패턴에 매칭되면 수행하는 awk

netstat.awk
#!/bin/awk
BEGIN{
        pring "BEGIN\n";
        cnt = 0;
}
{
        if ($3 ~ /S/) {
                cnt++;
                printf "NO:%d.\tNR:%d.\tFNR:%d\t%s\n", cnt, NR, FNR, $0;
        }
}
END{
        printf "cnt: %d\nEND\n", cnt;
}
netstat.txt

(읽을 파일 만들기)

netstat -r > netstat.txt

 

확인커맨드

awk -f netstat.awk netstat.txt
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

env : 환경변수 출력

source 파일경로 : 해당 파일을 즉시 설정으로 적용

du 파일경로 : 해당 파일의 용량 표시

    -h : 용량을 보기쉬운 단위로 표현

su : 슈퍼유저로 로그인 시도

    - : 모든 환경변수도 전환

which 실행기(언어) : 환경변수의 PATH 경로에 존재하는 실행파일의 위치를 검색하여 출력

whereis 실행기(언어) : which 와 비슷함.(자세한건 모르겠음)

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,