bash script (backup)2020. 10. 26. 11:47

 

반달가면 이글루에서 백업 - bahndal.egloos.com/431802

 

sed를 이용해서 특정 문자열을 다른 문자열로 바꾸는 방법이다. 일단 아래의 예시를 보자.

 

# 처음 나오는 abc를 ABCD로 교체

echo "abc_abc_abc" | sed "s/abc/ABCD/"
ABCD_abc_abc

 

g 옵션을 추가하면 지정한 모든 문자열을 바꾼다.

 

# 모든 abc를 ABCD로 교체

echo "abc_abc_abc" | sed "s/abc/ABCD/g"
ABCD_ABCD_ABCD

 

grep에서 주로 사용하는 정규표현(regular expression)도 사용할 수 있다.

 

# abc로 끝나는 부분을 ABCD로 교체
echo "abc_abc_abc" | sed "s/abc$/ABCD/"
abc_abc_ABCD

 

파일에서 문자열을 바꾸고 다른 파일로 저장하려면 아래와 같이 하면 되겠다.

 

sed "s/abc/ABCD/" my_file.txt > my_file_modified.txt

 

또는

 

cat my_file.txt | sed "s/abc/ABCD/" > my_file_modified.txt

 

특정 문자열을 없앨 수도 있다. 아래의 예시를 참고하자.

 

# 처음 나오는 abc를 제거

echo "abc_abc_abc" | sed "s/abc//"

_abc_abc

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 23. 14:38

 

반달가면 이글루에서 백업 - bahndal.egloos.com/426420

 

텍스트 파일의 각 행을 무작위로 뒤섞거나 특정 범위의 수를 무작위로 뒤섞고 싶을 때는 shuf 명령을 사용하면 되겠다.

 

예를 들어 my_file.txt에서 무작위로 5개의 행을 뽑아서 화면에 출력하고 싶다면 아래와 같이 하면 되겠다.

 

shuf -n 5 my_file.txt

 

my_file.txt의 전체 행을 무작위로 재배열하고 싶다면, my_file.txt가 몇개의 행으로 이루어져 있는지 찾은 후 이 값을 -n 옵션에 넘겨주자.

 

shuf -n `cat my_file.txt | wc -l` my_file.txt

 

출력 결과를 다른 파일로 저장하고 싶다면 redirection을 이용하면 된다.

 

shuf -n `cat my_file.txt | wc -l` my_file.txt > my_file_shuffled.txt

 

만약 35이상 45이하의 수를 무작위 순서로 출력하고 싶다면 아래과 같이 -i 옵션을 사용하면 된다.

 

shuf -i 35-45

 

사무실에서 커피 내기 사다리 타기 대신으로도 활용할 수 있을 듯;;

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 23. 14:33

 

반달가면 이글루에서 백업 - bahndal.egloos.com/422524

 

리눅스에서 파일을 암호화하고 싶다면 openssl을 활용할 수 있다. 터미널창에서 아래와 같이 입력한다.

 

openssl aes-256-cbc -in my_file.txt -out my_file.enc

 

my_file.txt 파일을 미국의 암호화 표준인 AES로 암호화하여 my_file.enc라는 이름으로 저장하는 예이다. 위와 같이 실행하면 암호를 입력하라는 메시지가 나오는데, 암호를 정해서 넣어주면 되겠다. (대소문자, 수자, 특수기호 등을 섞어서 최소 15자 이상이 되도록 정하는 것을 추천)

 

암호화하면 암호화된 파일이 새로 생기고 원본 파일도 그대로 있으므로 원본 파일은 rm 명령으로 지워주자.

 

rm my_file.txt

 

아래와 같이 -d 옵션을 주면 원래 파일로 복원할 수 있다. 암호화된 my_file.enc를 복원하여 my_file.txt로 저장하는 예이다.

 

openssl aes-256-cbc -d -in my_file.enc -out my_file.txt

 

마찬가지로 복원을 위해서는 암호를 입력해 주면 된다. shell script에서 파일 암호화를 사용할 때, 암호를 특정 규칙에 의해 자동으로 생성하거나 한번 암호를 입력 받아서 여러개의 파일을 작업해야 할 상황이 있다면 아래와 같은 방식이 유용하다.

 

password_str="my_password"

echo -n "$password_str" | openssl aes-256-cbc -in my_file.txt -out my_file.enc -pass stdin

 

위의 예는 password_str 변수에 저장된 암호를 echo 명령으로 출력하고 openssl에서는 -pass stdin 옵션을 추가해서 암호가 자동으로 입력되도록 하는 것이다. 엔터가 포함되지 않도록 echo 명령에 -n 옵션을 사용했다. 암호는 파이프(|)에 의해 openssl 명령의 입력으로 넘어가기 때문에 암호가 실제로 터미널창 화면에 출력되지는 않는다.

 

복원은 앞에서 예시한 바와 같이 -d 옵션을 사용하면 된다.

 

echo -n "$password_str" | openssl aes-256-cbc -d -in my_file.enc -out my_file.txt -pass stdin

 

암호를 자동으로 입력하는 다른 방법으로 아래의 예시를 보자.

 

openssl aes-256-cbc -in my_file.txt -out my_file.enc -pass pass:my_password

 

위와 같은 방식은 비추천이다. 암호화가 진행되고 있는 도중에 ps 명령으로 프로세스 목록을 보면 암호가 그대로 드러나기 때문이다. echo 명령과 조합하는 방식이 더 낫다.

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 22. 12:17

 

반달가면 이글루에서 백업 - bahndal.egloos.com/418681

 

텍스트 파일에서 2개 이상의 문자열을 검색하는 방법이다.

(A and B) 일단 A라는 문자열과 B라는 문자열이 모두 포함된 행을 찾는 것은 간단하다. 파이프(|)를 이용해서, A가 포함된 뿐을 골라낸 후에 거기서 B를 골라내면 된다.

 

cat file.txt | grep A | grep B

 

(A or B) A 또는 B가 포함된 행을 찾으려면 A와 B를 파이프(|) 기호로 연결하면 된다. 연산자로 인식하도록 역슬래시(\)를 붙여준다.

 

cat file.txt | grep "A\|B"

 

또는 egrep 명령을 활용해도 된다. 작은따옴표(')와 괄호를 이용한다.

 

cat file.txt | egrep '(A|B)'

 

만약 shell script에서 변수에 할당된 문자열을 사용하려고 한다면 egrep으로는 어렵고 앞에 언급한 파이프 기호를 이용해야 한다.

 

str_a="1st string"

str_b="2nd string"

cat file.txt | grep "$str_a\|$str_b"

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 22. 12:13

 

반달가면 이글루에서 백업 - bahndal.egloos.com/410986

 

탭이 포함된 문자열을 검색하려면 grep이 아니라 awk를 이용해야겠다.

 

test_file.txt에서 "abc[탭]def"를 검색하려면

 

cat test_file.txt | awk "/abc\tdef/"

 

또는

 

awk "/abc\tdef/" test_file.txt

 

이렇게 써야 한다.

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 21. 16:56

 

반달가면 이글루에서 백업 - bahndal.egloos.com/406163

 

그냥 echo 명령만 사용하면 자동으로 줄바꿈이 되는데, 전에 출력한 문자열을 지우고  새 문자열을 겹쳐 쓰고 싶다면 -n 옵션과 -e 옵션을 사용하자.

-n 옵션은 줄바꿈을 하지 않는 것이고, -e 옵션은 리턴(\r), 탭(\t) 등을 사용할 수 있게 해 주는 옵션이다.

echo "abc\tdef"
abc\tdef
echo -e "abc\tdef"
abc    def

전에 출력한 문자열을 지우고 그 자리에 새로운 문자열을 출력하려면, 첫번째 문자열을 출력할 때 -n 옵션으로 줄바꿈을 억제한 후에 다음 문자열을 출력할 때 -e 옵션으로 리턴(\r)을 출력해서 프롬프트를 줄 시작점으로 보내주면 된다. 아래의 예시를 참고하자.

echo -n "this is the first."
sleep 3
echo -e "\rthis is the 2nd.   "

첫번째 문자열 출력후 3초후에 두번째 문자열을 같은 줄에 겹쳐 쓰게 된다.

두번째 문자열이 첫번째보다 짧다면 이전 출력 뒷부분이 남을 것이므로 뒤쪽에 공백(space)을 충분히 주자.

shell script에서 진행 상황을 표시해 주고 싶을 때 요긴하게 사용할 수 있다. 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 21. 12:20

 

반달가면 이글루에서 백업 - bahndal.egloos.com/404027

 

텍스트 파일에서 대문자를 전부 소문자로 바꾸거나 소문자를 전부 대문자로 바꾸는 방법이다. tr 명령을 이용하면 되겠다.

 

# sample.txt 파일의 소문자를 전부 대문자로 바꾸는 경우

tr [:lower:] [:upper:] < sample.txt

 

#반대로 대문자를 전부 소문자로 바꾸는 경우

tr [:upper:] [:lower:] < sample.txt

 

위와 같이 하면 바뀐 결과가 화면에 출력된다. 파일로 저장하고 싶으면 아래와 같이 하면 된다. sample.txt 파일에서 대문자를 모두 소문자로 바꾸고 이 결과를 sample.lower.txt에 저장하는 방법이다.

 

tr [:upper:] [:lower:] < sample.txt > sample.lower.txt

 

스크립트에서 특정 변수에 할당된 문자열에 적용하는 것도 간단하다. 변수 sample_string에 할당된 문자열을 모두 소문자로 변환하고 싶다면 아래의 예시를 참고하자.

 

sample_string="This Is A Sample String"

echo "$sample_string" | tr [:upper] [:lower:]

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 21. 12:16

 

반달가면 이글루에서 백업 - bahndal.egloos.com/402428

 

난수(random number)를 생성하고 싶으면 $RANDOM 변수를 이용하면 되겠다.

echo $RANDOM

위와 같이 그냥 사용하면 0에서 32767 사이의 자연수가 만들어진다. 만약 난수의 범위를 정하고 싶다면 모듈로(modulo)연산을 이용하자. 예를 들어 두자리수를 만들려면 난수를 100으로 나눈 나머지값을 취하면 된다.

echo `expr $RANDOM % 100`

 

좀 더 복잡한 범위를 주고 싶다면 지난번에 올린 산수 계산 게시물에 있는 bc를 이용하자.

범위가 120이상 253이하인 난수를 만들려면 어떻게 할까? 일단 0~133 사이의 난수를 만든 후에 120을 더해 주면 된다.

 

echo "($RANDOM % 134) + 120" | bc

변수를 이용하면 좀 더 유연하게 사용할 수 있겠다. 난수 생성용 seed는 현재 시각의 나노초(nanosecond) 부분을 사용했다.

 

# random seed
RANDOM=`date "+%N"`
# make a random number between 120 & 253
min_val=120
max_val=253
mod_val=`echo "$max_val - $min_val + 1" | bc`
random_val=`echo "($RANDOM % $mod_val) + $min_val" | bc`
echo $random_val

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 20. 11:02

 

반달가면 이글루에서 백업 - bahndal.egloos.com/399592


리눅스 셸에서 산수 계산을 하는 방법이다.

간단한 정수 연산은 아래와 같이 할 수 있다.

expr 34 + 51

이렇게 하면 85가 출력될 것이다. 수와 연산기호 사이에는 반드시 띄어쓰기를 해 주자. 더하기(+), 빼기(-), 곱하기(\*), 나누기(/), 모듈로(modulo, %) 등을 할 수 있다. 곱하기의 경우 연산기호에 유의하자. 반드시 \* 이렇게 써야 한다.

34*51의 결과를 result 변수에 저장하려면 아래와 같이 하면 되겠다.

result=`expr 34 \* 51`
echo "$result"

정수가 아니라 실수를 사용하고 싶다거나, 연산기호가 여러개 들어가는 복잡한 계산을 하려면 expr로는 안되고 bc를 이용해야 한다.

34.8+51.2를 더하고 이 값을 제곱하려면 아래와 같이 하면 되겠다.

echo "(34.8+51.1)^2" | bc

bc를 사용할 때는 곱하기 연산기호를 평소처럼 그냥 쓰면 된다. 예를 들어 24*3은 아래와 같이 하면 된다.

echo "24*3" | bc

echo 명령으로 출력하는 수식은 반드시 따옴표로 묶어 주자.


-- 2013.7.24 추가 --

실수 나눗셈에 대한 부분을 추가로 적어 두기로 했다.

echo "1/2" | bc
0

1을 2로 나누는 예시인데, 결과가 0.5가 아니라 0이라고 나온다. 기본 설정이 정수 연산으로 되어 있어서 그러니, 제대로 된 결과를 얻으려면 scale 변수에 소수점 이하 몇자리를 출력할 것인지 지정해 주어야겠다. 소수점 이하 세자리를 출력하고 싶으면 아래와 같이 해 보자.

echo "scale=3; 1/2" | bc
0.500

이제 결과가 제대로 나왔다.

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 19. 09:54

 

반달가면 이글루에서 백업 - bahndal.egloos.com/396980

 

지난번에 적어 놓은 ssh 자동 접속 방법을 조금 확장시켜 볼 수 있겠다.

expect는 인자(argument)를 사용할 수 있기 때문에, 접속 주소나 암호 등을 script에 넣지 않고 인자로 지정할 수 있다. 실행 명령에 사용된 인자는 argv라는 이름의 변수로 가져온다.

 

예제 script 이름은 ssl_login2.exp로 하자. 인자 순서는 접속주소, 접속암호, 셸 프롬프트(shell prompt) 문자열 순서로 정하면 실행은 이런 식이 될 것이다.

 

expect -f ssl_login2.exp john@192.168.0.10 my_password "john>"

 

ssh서버 192.168.0.10에 john이라는 계정으로 접속하고 암호는 my_password인 경우이다. 로그인했을 경우 셸 프롬프트에 john>이라는 문자열이 들어있다고 가정했다. 셸 프롬프트를 인자로 가져오는 경우 bash에서 사용되는 특수 기호(>, | 등)가 포함되어 있다면 위의 예와 같이 반드시 따옴표 처리를 해 주자.

 

ssl_login2.exp script는 아래와 같이 만들면 되겠다. 인자로 받은 주소, 접속암호, 셸 프롬프트 문자열 값을 각각 addr, password, prompt 변수에 할당했다. 로그인 후에 하는 작업은 지난번처럼 그냥 커널 버전 확인만 하는 것으로 했다.

 

# script file: ssl_login2.exp

# version 2 (with argument support)

# set variables

set addr [lindex $argv 0]

set password [lindex $argv 1]

set prompt [lindex $argv 2]

# spawn ssh session

spawn ssh $addr

expect -nocase "password"

send "$password\r"

expect "$prompt"

# execute commands (in this example, 'uname -r')

send "uname -r\r"

expect "$prompt"

send "exit\r"

exit 0

 

각기 다른 서버에 들어가 같은 종류의 반복작업을 해야 할 경우 나름 편리하게 사용할 수 있다.

 

Posted by 반달가면

댓글을 달아 주세요