awk
awk는 명령어를 입력한 다음, 작은 따옴표로 둘러싸인 패턴/액션을 입력하고 마지막에 입력 파일을 지정
awk 'pattern' filename
awk '{action}' filename
awk 'pattern {action}' filename
awkfile
vi awkfile
홍 길동 3324 5/11/96 50354
임 꺽정 5246 15/9/66 287650
이 성계 87654 6/20/58 60000
정 약용 908683 9/40/48 365000
awk '{print $0}' awkfile
전체 print
홍 길동 3324 5/11/96 50354
임 꺽정 5246 15/9/66 287650
이 성계 87654 6/20/58 60000
정 약용 908683 9/40/48 365000
awk '{print $1}' awkfile
구분자를 사용해(default ' ') 첫번째 print
홍
임
이
정
awk '{print NR}' awkfile
파일의 레코드 번호 출력
1
2
3
4
awk '/길동/' awkfile
길동을 찾아서 출력
홍 길동 3324 5/11/96 50354
안녕하세요? 임 꺽정님!
안녕하세요? 정 약용님!
awk '/^정/{print $1, $2, $3}' awkfile
맨 앞에 정이 들어가는 데이터를 찾고, 출력
정 약용 908683
df | awk '$4 < 100000' : |을 이용해 파이프라인 생성
devfs 388 388 0 100% 672 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
awk '{max=($3 > $5) ? $1 : $2; print max}' awkfile
$3과 $5를 비교해서 $3이 크면 $1을 출력하고, 아니면 $2를 출력해라
길동
꺽정
이
정
awk -F ' ' '{print $4}' awkfile
' '로 split하고 4번째 값 출력
5/11/96
15/9/66
6/20/58
9/40/48
더 자세한건 제 블로그 참고
sed 's/찾을 텍스트/바꿀 텍스트/g' 파일명
으로 사용함-i
옵션은 --in-place를 의미함s
는 문자열 치환을 의미g
는 모든 라인에 적용한다는 의미. 작성하지 않으면find . -mtime +30 | xargs mv -i {} {}.bak
xargs
(Tip) 그러나 찾고 삭제는 find -delete가 좋음. 아래 예제처럼 하면 파일 하나당 서브 프로세스가 생성됨
find . -name '*.mp3' | xargs rm
xargs
ls를 이용해 text 파일 목록을 가져오고 각 파일 내용을 cat으로 읽고 병합 파일 만듬
ls *.txt | xargs cat >> abc.merge
nohup
사용 방법
nohup shell.sh &
nohup
종료하는 두가지 방법
ps ef | grep shell.sh
ps -ef로 pid 번호 찾은 후
kill -9 pid번호
로그
screen
nohup을 대체할 수 있음
apt-get install screen
스크린 생성
screen -S screen_name
저는 screen -dmS screen_name을 자주 사용함
-dm
: 커맨드를 실행하고 대화식으로 하지 않고 인자로 연결-S
: 사용 가능한 이름을 지정해 나중에 쉽게 다시 연결screen
스크린으로 진입
screen -r screen_name
스크린 리스트 확인
screen -list
-r
: 재귀적으로 폴더 복사-P
: ssh 포트 지정-i
: ssh identify file을 지정해 파일 이동local -> remote
scp local_path user@ip:remote_directory
scp
remote -> local
scp user@ip:remote_directory local_path
remote -> remote
scp user1@ip1:source_remote_directory user2@ip2:target_remote_directory
/dev/null
출력 스트림을 버릴 경우 사용됨
echo "hello"
# hello
echo hello > /dev/null
# 아무것도 출력되지 않음
/dev/null
& : 백그라운드에서 실행하라
rm test > /dev/null 2>&1
유용한 팁 : 터미널에 출력되는 값 복사할때 어떻게 하나요, 현재 경로 같은 것들
pbcopy : 명령어의 결과를 클립보드로 복사
echo "hihi" | pbcopy
jupyter 경로를 복사하고 싶은 경우
echo `which jupyter` | pbcopy
현재 경로 복사하고 싶은 경우
echo `pwd` | pbcopy
쉐뱅(Shebang)
#! 이 친구를 뜻함
#!/bin/bash
사용할 수 있는 쉘 확인하는 방법
cat /etc/shells
쉘 스크립트 만들기
vi hello.sh
#!/bin/bash
echo "Coool!"
echo "Hello!"
하지만 vs code에서 그냥 file_name.sh를 만들면!
주석
함수
function은 작성해도 되고, 생략해도 됨
#!/bin/bash
hello_function() {
echo "Hello!!!"
}
function hello_function2() {
echo "Hello2~"
echo "인자값: ${@}"$
hello_function
hello_function2
hell_function2 "hi" "hello"
위치 매개 변수
test.sh
#!/bin/bash
echo "file name is" $0
echo "first arg is" $1
echo "second arg is" $2
echo "all arg: " $@
echo "len of arg : " $#
실행하기
bash test.sh 1 2 3
for loop
for_loop.sh
#!/bin/bash
SEQUENCE=$(seq 0 9)
for i in $SEQUENCE
do
echo "Running loop seq ${i}"
done
for loop
for_loop2.sh
#!/bin/bash
ORDER="5 6 7 8 9 4 3 2 1 0"
for i in $ORDER
do
echo "Running loop ${i}"
done
for loop
for_loop3.sh
#!/bin/bash
for ((i=0;i<=9;i++))
do
echo "Running loop "$i
done
while
while_loop.sh
#!/bin/bash
count=0
while [ ${count} -le 5 ]; do
echo ${count}
count=$(( ${count}+1 ))
done
```
#!/bin/bash
string1=$1
string2=$2
string3="awesome"
if [ ${string1} == ${string2} ]; then
echo "string 1, string2 is same"
elif [ ${string1} == ${string3} ]; then
echo "string 1 is awesome"
else
echo "else condition"
fi
```
;;
로 끝을 표시함case_test.sh
#!/bin/bash
for string in "hi" "HELLO" "WORLD" "hello" "world" "wow" "awesome" "start" "end" "etc"; do
case ${string} in
hello|HELLO)
echo "hello or HELLO : ${string}"
;;
wo*)
echo "wo로 시작하는 단어 : ${string}"
;;
a*|end)
echo "a로 시작하는 단어 or end일 때 : ${string}"
;;
*)
echo "기타 : ${string}"
;;
esac
done
set_test.sh
#!/bin/bash
set -euo pipefail
echo "hi"
echi hihihi
# error 발생
echo "hello"
Bash에서 ''와 ""는 다릅니다!!!!!
''(작은 따옴표)는 단순히 문자열을 의미하고, ""(쌍 따옴표)는 변수의 값이 참조됨
#!/bin/bash
BASH_VAR="Bash Script is Amazing"
# single quote
echo '${BASH_VAR}'
# double quotes
echo "${BASH_VAR}"
${BASH_VAR}
Bash Script is Amazing
```
#!/bin/bash
set -euo pipefail
# 종료가 되거나 끝나면 메세지 전송
trap '[ "$?" -eq 0 ] || send_error ${LINENO} ${FUNCNAME}' EXIT
function send_error {
local lineno=$1
local funname=$2
local current_date=$(date '+%Y-%m-%d %H:%M:%S')
curl 'https://hooks.slack.com/services/T00000000/BXXXXX/asdasdasd' -d "payload={\"text\": \"[CRON][ERROR] LineNum=${lineno} FunName=${funname}\"}"
}
function slack_test {
echo "now sleep..."
echo "command + c"
sleep 5
}
```