01 리눅스에서 파이썬 스크립트 실행하기
02 로깅 처리
-01 echo
-02 tee
03 정렬
-01 ls 결과 정렬
-02 sort
04 특수기호 정의
-01 * 과 ?
-02 []
-03 ~와 -
-04 ''와 ""
-05 ; 과 |
05 논리 연산자
-01 and 연산자
-02 or 연산자
-03 not 연산자
01 리눅스에서 파이썬 스크립트 실행하기
os 프롬포트에서 파이썬 프롬프트로 명령어 전달을 수행할 수 있다. (입력 프롬프트를 사용)
ipython 사용 시 쓸데없는 헤더들을 출력하고 싶지 않다면 --no-banner와 함께 python prompt로 진입하는 것도 좋다.
(base) itwill@ubuntu:~$ cds
(base) itwill@ubuntu:~/linux_ex/ch9$ ipython
Python 3.12.7 | packaged by Anaconda, Inc. | (main, Oct 4 2024, 13:27:36) [GCC 11.2.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.27.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: exit
(base) itwill@ubuntu:~/linux_ex/ch9$ ipython --no-banner
In [1]:
vi 19_ipython.sh
#!/bin/sh
echo "파이썬 스크립트를 시작하겠습니다..."
sleep 2
maindir=/home/itwill/linux_ex/ch9
ipython --no-banner --no-confirm-exit << _eof_
import pandas as pd
emp = pd.read_csv("$maindir/emp.csv")
mean_sal = round(emp.loc[emp['DEPTNO'] == 10, 'SAL'].mean())
print(mean_sal)
_eof_
echo "파이썬 스크립트를 종료하겠습니다..."
쉘스크립트와 파이썬이 섞여있다. 따라서 end of file이라는 뜻의 _eof_로 파이썬 스크립트의 시작과 끝을 지정한다.
(_eof_의 경우 원하는 형태로 작성 가능하다.)
$ ipython --no -banner -- no-confirm-exit << _eof
python 명령어...
_eof_
** 참고 : 리눅스에서 한글 깨짐 해결 (인코딩 변경)
$ iconv -f CP949 -t UTF8 card_history.csv > card_history_new.csv
** 참고 : os 프롬포트에서 sql 프롬포트로 명령어 전달하기
$ sqlplus -s scott/oracle << _eof_
select ...;
_eof_
$ R << _eof_
R 명령어...
_eof_
(base) itwill@ubuntu:~/linux_ex/ch9$ sh 19_ipython.sh
파이썬 스크립트를 시작하겠습니다...
In [1]:
In [2]:
In [3]:
In [4]: 2917
In [5]: 파이썬 스크립트를 종료하겠습니다...
vi 19_ipython.sh를 card 관련 코드로 변경해본다.
#!/bin/sh
echo "파이썬 스크립트를 시작하겠습니다..."
sleep 2
maindir=/home/itwill/linux_ex/ch9
ipython --no-banner --no-confirm-exit << _eof_ > /dev/null
import pandas as pd
card = pd.read_csv('$maindir/card_history.csv')
card = card.drop(columns='NUM')
card = card.map(lambda x : int(x.replace(',','')))
card.sum().to_csv("$maindir/total.csv", header=False)
_eof_
echo
echo "파이썬 스크립트를 종료하겠습니다..."
if [ -f $maindir/total.csv ]
then
echo "분석 스크립트 정상 수행 완료"
cat $maindir/total.csv
else
echo "스크립트 실행 오류 발생"
fi
(base) itwill@ubuntu:~/linux_ex/ch9$ sh 19_ipython.sh
파이썬 스크립트를 시작하겠습니다...
파이썬 스크립트를 종료하겠습니다...
분석 스크립트 정상 수행 완료
식료품,795500
의복,3947700
외식비,281400
책값,945000
온라인소액결제,186300
의료비,633600
[ 연습문제 - 20_ipython2.sh ]
** 참고 : 리눅스에서 한글 깨짐 해결 (인코딩 변경)
$ iconv -f CP949 -t UTF8 delivery.csv > delivery_new.csv
$ delivery_new.csv delivery.csv
delivery.csv 파일을 읽고 시간대별배달건수가 가장 많은 업종의 이름을 출력 후 result.csv로 저장.
저장 후 결과 출력하기.
[ 내 답변 ]
#!/bin/sh
echo "파이썬 스크립트를 시작하겠습니다..."
sleep 2
maindir=/home/itwill/linux_ex/ch9
ipython --no-banner --no-confirm-exit << _eof_ > /dev/null
import pandas as pd
delivery = pd.read_csv('$maindir/delivery_new.csv')
delivery = delivery.drop(columns=['시도','시군구','읍면동'])
df = delivery.groupby(["시간대","업종"])["통화건수"].sum()
result = df.groupby(level=0).idxmax()
result = result.apply(lambda x: x[1])
result.name = "업종"
result.index.name = "시간대"
result.to_csv("$maindir/result.csv", header=False)
_eof_
echo
echo "파이썬 스크립트를 종료하겠습니다..."
if [ -f $maindir/result.csv ]
then
echo "분석 스크립트 정상 수행 완료"
cat $maindir/result.csv
else
echo "스크립트 실행 오류 발생"
fi
(base) itwill@ubuntu:~/linux_ex/ch9$ sh 20_ipython2.sh
파이썬 스크립트를 시작하겠습니다...
파이썬 스크립트를 종료하겠습니다...
분석 스크립트 정상 수행 완료
0,치킨
1,치킨
2,음식점-중국음식
3,음식점-중국음식
4,음식점-중국음식
5,음식점-중국음식
6,음식점-중국음식
7,음식점-중국음식
8,음식점-중국음식
9,음식점-중국음식
10,음식점-중국음식
11,음식점-중국음식
12,음식점-중국음식
13,음식점-중국음식
14,음식점-중국음식
15,음식점-중국음식
16,음식점-중국음식
17,치킨
18,치킨
19,치킨
20,치킨
21,치킨
22,치킨
23,치킨
[ 문제풀이 ] + 여러가지 옵션
#!/bin/sh
# env
maindir=/home/itwill/linux_ex/ch9
logdir=$maindir/log
if [ ! -d $logdir ]
then
mkdir -p $logdir
fi
# main
echo "파이썬 분석 프로그램 실행\c"
for i in . . .
do
echo "${i}\c"
sleep 1
done
echo
# 파이썬 프롬프트 실행
start_time=$(date +%s) # 시작시간 체크
echo "시작 시간 : $(date '+%Y/%m/%d %H:%M:%S')"
ipython --no-banner --no-confirm-exit << _eof_ > /dev/null
import pandas as pd
df = pd.read_csv("$maindir/delivery.csv")
df_new = df.groupby(['시간대','업종'])['통화건수'].sum().reset_index()
df_new['최대통화건수'] = df_new.groupby('시간대')['통화건수'].transform('max')
result = df_new.query('최대통화건수 == 통화건수')[['시간대','업종']]
result.to_csv("$maindir/result.csv", index=False)
_eof_
end_time=$(date +%s) # 종료시간 체크
elapsed=$(expr $end_time - $start_time) # 경과시간 계산
echo "파이썬 분석 프로그램 종료"
echo "종료 시간 : $(date '+%Y/%m/%d %H:%M:%S')"
echo "소요 시간: ${elapsed}초"
echo "출력건수 : $(cat $maindir/result.csv | wc -l) 건"
# 분석 결과 체크
if [ -f $maindir/result.csv ]
then
echo "분석 스크립트 정상 수행 완료"
echo "┌────────────────────────────┐"
echo "│ 분석 결과 출력 │"
echo "└────────────────────────────┘"
cat $maindir/result.csv
else
echo "스크립트 실행 오류 발생"
fi
# 분석 결과 삭제
rm $maindir/result.csv
(base) itwill@ubuntu:~/linux_ex/ch9$ sh 20_ipython2.sh
파이썬 분석 프로그램 실행...
시작 시간 : 2026/07/22 11:50:17
파이썬 분석 프로그램 종료
종료 시간 : 2026/07/22 11:50:18
소요 시간: 1초
출력건수 : 24 건
분석 스크립트 정상 수행 완료
┌────────────────────────────┐
│ 분석 결과 출력 │
└────────────────────────────┘
0,치킨
1,치킨
2,음식점-중국음식
3,음식점-중국음식
4,음식점-중국음식
5,음식점-중국음식
6,음식점-중국음식
7,음식점-중국음식
8,음식점-중국음식
9,음식점-중국음식
10,음식점-중국음식
11,음식점-중국음식
12,음식점-중국음식
13,음식점-중국음식
14,음식점-중국음식
15,음식점-중국음식
16,음식점-중국음식
17,치킨
18,치킨
19,치킨
20,치킨
21,치킨
22,치킨
23,치킨
02 로깅 처리
-01 echo
if [ ! -f ...]
then
echo "파일이 존재하지 않습니다." >> test.log
fi
echo "프로그램 시작시간" >> test.log
-02 tee
표준출력(모니터)과 특정 파일에 동시 출력이 가능하다.
즉, tee는 백그라운드에서 실행도 되지만 화면에 동시에 실행결과도 출력해준다.
* 사용법
echo "문자열" | tee [옵션]
* 옵션
-a : 이어쓰기
(base) itwill@ubuntu:~/linux_ex/ch9$ echo "프로그램 시작" >> test.log
(base) itwill@ubuntu:~/linux_ex/ch9$ cat test.log
프로그램 시작
(base) itwill@ubuntu:~/linux_ex/ch9$ echo "프로그램 종료" | tee -a test.log
프로그램 종료
(base) itwill@ubuntu:~/linux_ex/ch9$ cat test.log
프로그램 시작
프로그램 종료
vi 20_ipython2.sh
#!/bin/sh
# env
maindir=/home/itwill/linux_ex/ch9
logdir=$maindir/log
todate=$(date +%Y%m%d)
if [ ! -d $logdir ]
then
mkdir -p $logdir
fi
# main
echo "파이썬 분석 프로그램 실행" | tee -a ${logdir}/python_${todate}.log
#for i in . . .
#do
# echo "${i}\c"
# sleep 1
#done
#echo
# 파이썬 프롬프트 실행
start_time=$(date +%s) # 시작시간 체크
echo "시작 시간 : $(date '+%Y/%m/%d %H:%M:%S')" | tee -a ${logdir}/python_${todate}.log
ipython --no-banner --no-confirm-exit << _eof_ > /dev/null
import pandas as pd
df = pd.read_csv("$maindir/delivery.csv")
df_new = df.groupby(['시간대','업종'])['통화건수'].sum().reset_index()
df_new['최대통화건수'] = df_new.groupby('시간대')['통화건수'].transform('max')
result = df_new.query('최대통화건수 == 통화건수')[['시간대','업종']]
result.to_csv("$maindir/result.csv", index=False)
_eof_
end_time=$(date +%s) # 종료시간 체크
elapsed=$(expr $end_time - $start_time) # 경과시간 계산
echo "파이썬 분석 프로그램 종료" | tee -a ${logdir}/python_${todate}.log
echo "종료 시간 : $(date '+%Y/%m/%d %H:%M:%S')" | tee -a ${logdir}/python_${todate}.log
echo "소요 시간: ${elapsed}초" | tee -a ${logdir}/python_${todate}.log
echo "출력건수 : $(cat $maindir/result.csv | wc -l) 건" | tee -a ${logdir}/python_${todate}.log
# 분석 결과 체크
if [ -f $maindir/result.csv ]
then
echo "분석 스크립트 정상 수행 완료" | tee -a ${logdir}/python_${todate}.log
echo "┌────────────────────────────┐" | tee -a ${logdir}/python_${todate}.log
echo "│ 분석 결과 출력 │" | tee -a ${logdir}/python_${todate}.log
echo "└────────────────────────────┘" | tee -a ${logdir}/python_${todate}.log
cat $maindir/result.csv | tee -a ${logdir}/python_${todate}.log
else
echo "스크립트 실행 오류 발생" | tee -a ${logdir}/python_${todate}.log
fi
# 분석 결과 삭제
rm $maindir/result.csv
(base) itwill@ubuntu:~/linux_ex/ch9$ sh 20_ipython2.sh
파이썬 분석 프로그램 실행
시작 시간 : 2026/07/22 13:01:23
파이썬 분석 프로그램 종료
종료 시간 : 2026/07/22 13:01:24
소요 시간: 1초
cat: /home/itwill/linux_ex/ch9/result.csv: No such file or directory
출력건수 : 0 건
스크립트 실행 오류 발생
rm: cannot remove '/home/itwill/linux_ex/ch9/result.csv': No such file or directory
03 정렬
-01 ls 결과 정렬
* 정렬 옵션
-v : 자연정렬 (파일/디렉토리명에 숫자가 포함된 경우 숫자 기준으로 정렬)
-t : 시간정렬 (최근 수정 파일이 상단에 출력됨)
-r : 역순정렬
(base) itwill@ubuntu:~/linux_ex/ch9$ ls -lv
total 14016
-rwxr--r-- 1 itwill itwill 377 Jul 16 11:34 1_grep.sh
-rwxr--r-- 1 itwill itwill 242 Jul 16 12:00 2_cut.sh
-rwxr--r-- 1 itwill itwill 480 Jul 16 14:54 3_wc.sh
-rw-rw-r-- 1 itwill itwill 303 Jul 16 15:58 4_if1.sh
-rw-rw-r-- 1 itwill itwill 721 Jul 20 10:44 5_backup.sh
-rw-rw-r-- 1 itwill itwill 767 Jul 20 11:26 6_case.sh
-rw-rw-r-- 1 itwill itwill 389 Jul 20 12:15 7_head.sh
-rwxrwxr-x 1 itwill itwill 79 Jul 20 14:40 8_cron.sh
-rw-rw-r-- 1 itwill itwill 390 Jul 20 19:07 9_for1.sh
-rw-rw-r-- 1 itwill itwill 725 Jul 20 19:35 10_for2.sh
-rw-rw-r-- 1 itwill itwill 354 Jul 20 20:00 11_expr.sh
-rw-rw-r-- 1 itwill itwill 251 Jul 20 20:03 12_bc.sh
-rw-rw-r-- 1 itwill itwill 320 Jul 20 20:39 13_color.sh
-rw-rw-r-- 1 itwill itwill 597 Jul 21 12:50 14_text_color.sh
-rw-rw-r-- 1 itwill itwill 119 Jul 21 12:58 15_export1.sh
-rw-rw-r-- 1 itwill itwill 80 Jul 21 12:57 16_export2.sh
-rw-rw-r-- 1 itwill itwill 154 Jul 21 15:08 17_python.py
-rw-rw-r-- 1 itwill itwill 232 Jul 21 15:35 18_python.py
-rw-rw-r-- 1 itwill itwill 610 Jul 22 10:20 19_ipython.sh
-rw-rw-r-- 1 itwill itwill 2147 Jul 22 13:01 20_ipython2.sh
drwxrwxr-x 2 itwill itwill 4096 Jul 20 10:28 backup
-rw-rw-r-- 1 itwill itwill 1721 Mar 30 10:07 card_history.csv
-rw-rw-r-- 1 itwill itwill 320 Jul 21 12:04 color.env
-rw-rw-r-- 1 itwill itwill 38493 Jul 22 13:04 cron.log
-rw-rw-r-- 1 itwill itwill 6027546 Mar 30 10:07 delivery.csv
-rw-rw-r-- 1 itwill itwill 7914024 Jul 22 11:10 delivery_new.csv
-rw-rw-r-- 1 itwill itwill 734 Mar 30 10:07 emp.csv
-rw-rw-r-- 1 itwill itwill 239690 Jul 21 14:16 index.html
drwxr--r-- 2 itwill itwill 4096 Jul 22 12:59 log
-rwxr--r-- 1 itwill itwill 161 Jul 16 12:14 sh_260716.log
-rw-rw-r-- 1 itwill itwill 40 Jul 22 12:16 test.log
-rwxr--r-- 1 itwill itwill 8 Jul 16 11:06 test.txt
-rw-rw-r-- 1 itwill itwill 109 Jul 21 15:36 total.csv
-02 sort
파일 안의 내용을 정렬한다.
* 사용법
sort [옵션] 파일명
cat 파일명 | sort [옵션]
* 옵션
-n : 숫자 정렬
-r : 역순 정렬
-k : 필드 위치 지정 (ex. -k2 -> 두번째 필드값 기준으로 정렬)
-t : 필드 구분자 지정, 생략시 탭 (ex. -t, -> , 로 분리구분)
-u : 유일값 출력
ex)
$ sort -t: -k1 -r /etc/passwd -> /etc/passwd 파일을 : 으로 구분하여 첫 번쨰 필드 기준으로 정렬 수행
$ ls -l | sort -k -nr -> ls -l 결과를 탭으로 구분하여 다섯번째 필드 (파일크기) 역순 정렬
$ tail -n +2 emp.csv | sort -t, -k3 -> emp.csv 파일 첫 줄을 제외한 대상을 세 번쨰 필드 순서대로 정렬
$ cut -d, -f3 emp.csv | sort -u -> emp.csv 파일을 ,로 구분하여 세번째 필드의 유일값 출력
(base) itwill@ubuntu:~/linux_ex/ch9$ head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
(base) itwill@ubuntu:~/linux_ex/ch9$ sort -t: /etc/passwd
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
avahi:x:103:109:Avahi mDNS daemon:/run/avahi-daemon:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
_chrony:x:988:988:Chrony Daemon:/var/lib/chrony:/usr/sbin/nologin
colord:x:977:977:colord colour management daemon:/var/lib/colord:/usr/sbin/nologin
...
파일 크기 순으로 정렬을 해보도록 한다.
옵션에 인수가 들어가는 경우는 한 번 띄워서 쓴다. (그렇지 않은 경우 붙여서 사용)
(base) itwill@ubuntu:~/linux_ex/ch9$ ls -l | sort -k5 -n
total 14020
-rwxr--r-- 1 itwill itwill 8 Jul 16 11:06 test.txt
-rw-rw-r-- 1 itwill itwill 40 Jul 22 12:16 test.log
-rwxrwxr-x 1 itwill itwill 79 Jul 20 14:40 8_cron.sh
-rw-rw-r-- 1 itwill itwill 80 Jul 21 12:57 16_export2.sh
-rw-rw-r-- 1 itwill itwill 109 Jul 21 15:36 total.csv
-rw-rw-r-- 1 itwill itwill 119 Jul 21 12:58 15_export1.sh
-rw-rw-r-- 1 itwill itwill 154 Jul 21 15:08 17_python.py
-rwxr--r-- 1 itwill itwill 161 Jul 16 12:14 sh_260716.log
-rw-rw-r-- 1 itwill itwill 232 Jul 21 15:35 18_python.py
-rwxr--r-- 1 itwill itwill 242 Jul 16 12:00 2_cut.sh
-rw-rw-r-- 1 itwill itwill 251 Jul 20 20:03 12_bc.sh
-rw-rw-r-- 1 itwill itwill 303 Jul 16 15:58 4_if1.sh
-rw-rw-r-- 1 itwill itwill 320 Jul 20 20:39 13_color.sh
-rw-rw-r-- 1 itwill itwill 320 Jul 21 12:04 color.env
-rw-rw-r-- 1 itwill itwill 354 Jul 20 20:00 11_expr.sh
-rwxr--r-- 1 itwill itwill 377 Jul 16 11:34 1_grep.sh
-rw-rw-r-- 1 itwill itwill 389 Jul 20 12:15 7_head.sh
-rw-rw-r-- 1 itwill itwill 390 Jul 20 19:07 9_for1.sh
-rwxr--r-- 1 itwill itwill 480 Jul 16 14:54 3_wc.sh
-rw-rw-r-- 1 itwill itwill 597 Jul 21 12:50 14_text_color.sh
-rw-rw-r-- 1 itwill itwill 610 Jul 22 10:20 19_ipython.sh
-rw-rw-r-- 1 itwill itwill 721 Jul 20 10:44 5_backup.sh
-rw-rw-r-- 1 itwill itwill 725 Jul 20 19:35 10_for2.sh
-rw-rw-r-- 1 itwill itwill 734 Mar 30 10:07 emp.csv
-rw-rw-r-- 1 itwill itwill 767 Jul 20 11:26 6_case.sh
-rw-rw-r-- 1 itwill itwill 1721 Mar 30 10:07 card_history.csv
-rw-rw-r-- 1 itwill itwill 2147 Jul 22 13:01 20_ipython2.sh
drwxr--r-- 2 itwill itwill 4096 Jul 22 12:59 log
drwxrwxr-x 2 itwill itwill 4096 Jul 20 10:28 backup
-rw-rw-r-- 1 itwill itwill 43428 Jul 22 14:49 cron.log
-rw-rw-r-- 1 itwill itwill 239690 Jul 21 14:16 index.html
-rw-rw-r-- 1 itwill itwill 6027546 Mar 30 10:07 delivery.csv
-rw-rw-r-- 1 itwill itwill 7914024 Jul 22 11:10 delivery_new.csv
(base) itwill@ubuntu:~/linux_ex/ch9$ ls -l | sort -k5 -nr
-rw-rw-r-- 1 itwill itwill 7914024 Jul 22 11:10 delivery_new.csv
-rw-rw-r-- 1 itwill itwill 6027546 Mar 30 10:07 delivery.csv
-rw-rw-r-- 1 itwill itwill 239690 Jul 21 14:16 index.html
-rw-rw-r-- 1 itwill itwill 43475 Jul 22 14:50 cron.log
drwxrwxr-x 2 itwill itwill 4096 Jul 20 10:28 backup
drwxr--r-- 2 itwill itwill 4096 Jul 22 12:59 log
-rw-rw-r-- 1 itwill itwill 2147 Jul 22 13:01 20_ipython2.sh
-rw-rw-r-- 1 itwill itwill 1721 Mar 30 10:07 card_history.csv
-rw-rw-r-- 1 itwill itwill 767 Jul 20 11:26 6_case.sh
-rw-rw-r-- 1 itwill itwill 734 Mar 30 10:07 emp.csv
-rw-rw-r-- 1 itwill itwill 725 Jul 20 19:35 10_for2.sh
-rw-rw-r-- 1 itwill itwill 721 Jul 20 10:44 5_backup.sh
-rw-rw-r-- 1 itwill itwill 610 Jul 22 10:20 19_ipython.sh
-rw-rw-r-- 1 itwill itwill 597 Jul 21 12:50 14_text_color.sh
-rwxr--r-- 1 itwill itwill 480 Jul 16 14:54 3_wc.sh
-rw-rw-r-- 1 itwill itwill 390 Jul 20 19:07 9_for1.sh
-rw-rw-r-- 1 itwill itwill 389 Jul 20 12:15 7_head.sh
-rwxr--r-- 1 itwill itwill 377 Jul 16 11:34 1_grep.sh
-rw-rw-r-- 1 itwill itwill 354 Jul 20 20:00 11_expr.sh
-rw-rw-r-- 1 itwill itwill 320 Jul 21 12:04 color.env
-rw-rw-r-- 1 itwill itwill 320 Jul 20 20:39 13_color.sh
-rw-rw-r-- 1 itwill itwill 303 Jul 16 15:58 4_if1.sh
-rw-rw-r-- 1 itwill itwill 251 Jul 20 20:03 12_bc.sh
-rwxr--r-- 1 itwill itwill 242 Jul 16 12:00 2_cut.sh
-rw-rw-r-- 1 itwill itwill 232 Jul 21 15:35 18_python.py
-rwxr--r-- 1 itwill itwill 161 Jul 16 12:14 sh_260716.log
-rw-rw-r-- 1 itwill itwill 154 Jul 21 15:08 17_python.py
-rw-rw-r-- 1 itwill itwill 119 Jul 21 12:58 15_export1.sh
-rw-rw-r-- 1 itwill itwill 109 Jul 21 15:36 total.csv
-rw-rw-r-- 1 itwill itwill 80 Jul 21 12:57 16_export2.sh
-rwxrwxr-x 1 itwill itwill 79 Jul 20 14:40 8_cron.sh
-rw-rw-r-- 1 itwill itwill 40 Jul 22 12:16 test.log
-rwxr--r-- 1 itwill itwill 8 Jul 16 11:06 test.txt
(base) itwill@ubuntu:~/linux_ex/ch9$ cut -d, -f3 emp.csv | sort -u
ANALYST
CLERK
JOB
MANAGER
PRESIDENT
SALESMAN
(base) itwill@ubuntu:~/linux_ex/ch9$ tail -n +2 emp.csv | sort -t, -k3
7902,FORD,ANALYST,7566,1981-12-03 0:00,3000,,20
7788,SCOTT,ANALYST,7566,1987-04-17 0:00,3000,,20
7900,JAMES,CLERK,7698,1981-12-03 0:00,950,,30
7934,MILLER,CLERK,7782,1982-01-23 0:00,1300,,10
7876,ADAMS,CLERK,7788,1987-05-23 0:00,1100,,20
7369,SMITH,CLERK,7902,1980-12-17 0:00,800,,20
7566,JONES,MANAGER,7839,1981-04-02 0:00,2975,,20
7698,BLAKE,MANAGER,7839,1981-05-01 0:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 0:00,2450,,10
7839,KING,PRESIDENT,,1981-11-17 0:00,5000,,10
7499,ALLEN,SALESMAN,7698,1981-02-20 0:00,1600,300,30
7844,TURNER,SALESMAN,7698,1981-09-08 0:00,1500,0,30
7654,MARTIN,SALESMAN,7698,1981-09-28 0:00,1250,1400,30
7521,WARD,SALESMAN,7698,1982-02-22 0:00,1250,500,30
# 특정 단어가 존재하는 행을 제외하고 grep
(base) itwill@ubuntu:~/linux_ex/ch9$ grep -v EMPNO emp.csv
7369,SMITH,CLERK,7902,1980-12-17 0:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 0:00,1600,300,30
7521,WARD,SALESMAN,7698,1982-02-22 0:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 0:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 0:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 0:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 0:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-17 0:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 0:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 0:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 0:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 0:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 0:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 0:00,1300,,10
04 특수기호 정의
-01 * 과 ?
- * : 자리수에 상관없이 모든
-? : 한 자리수의 모든
ex)
$ ls *.sh
$ ls a*b -> abb, accccccb 출력
$ ls a?b -> abb 출력 (세자리 파일명만 출력)
-02 []
한 자리에 표현되는 모든 값 전달 가능
$ ls a[123].txt -> a1.txt, a2.txt, a3.txt 모두 출력
-03 ~와 -
$ cd ~ -> 홈디렉토리로 이동
$ cd - -> 이전 디렉토리로 이동
-04 ''와 ""
> 일반 문자열을 감쌀 때는 구분하지 않음
> '' 안의 $, '', \, *가 무시됨 (기호 그대로를 출력함)
ex)
$ var1="abcde"
$ echo "$var1" -> abcde가 출력됨
$ echo '$var1' -> $var1이 출력됨
-05 ; 과 |
> ; : 명령어의 연속 실행
> | : 이전 명령어의 결과를 다음 명령어의 인수로 전달
ex)
$ var1=1 ; var2 =2
$ ls -l | grep -v ^- -> ls -l 결과에서 -으로 시작하는 라인을 제외하고 출력
(base) itwill@ubuntu:~/linux_ex/ch9$ cp *.sh backup
(base) itwill@ubuntu:~/linux_ex/ch9$ ls
10_for2.sh 17_python.py 4_if1.sh card_history.csv log
11_expr.sh 18_python.py 5_backup.sh color.env sh_260716.log
12_bc.sh 19_ipython.sh 6_case.sh cron.log test.log
13_color.sh 1_grep.sh 7_head.sh delivery.csv test.txt
14_text_color.sh 20_ipython2.sh 8_cron.sh delivery_new.csv total.csv
15_export1.sh 2_cut.sh 9_for1.sh emp.csv
16_export2.sh 3_wc.sh backup index.html
(base) itwill@ubuntu:~/linux_ex/ch9$ mkdir test
(base) itwill@ubuntu:~/linux_ex/ch9$ cd test
(base) itwill@ubuntu:~/linux_ex/ch9/test$ touch a1.txt a2.txt a3.txt b1.txt b2.txt b3.txt
(base) itwill@ubuntu:~/linux_ex/ch9/test$ ls
a1.txt a2.txt a3.txt b1.txt b2.txt b3.txt
(base) itwill@ubuntu:~/linux_ex/ch9/test$ ls [ab]1.txt
a1.txt b1.txt
(base) itwill@ubuntu:~/linux_ex/ch9/test$ ls a[123].txt
a1.txt a2.txt a3.txt
(base) itwill@ubuntu:~/linux_ex/ch9/test$ ls a?.txt
a1.txt a2.txt a3.txt
(base) itwill@ubuntu:~/linux_ex/ch9/test$ ls a?.txt
a1.txt a2.txt a3.txt
(base) itwill@ubuntu:~/linux_ex/ch9/test$ ls a*.txt
a1.txt a2.txt a3.txt aaa.txt
(base) itwill@ubuntu:~/linux_ex/ch9/test$ echo "abcde"
abcde
(base) itwill@ubuntu:~/linux_ex/ch9/test$ echo 'abcde'
abcde
(base) itwill@ubuntu:~/linux_ex/ch9/test$ var1=abcde
(base) itwill@ubuntu:~/linux_ex/ch9/test$ echo $var1
abcde
(base) itwill@ubuntu:~/linux_ex/ch9/test$ echo "변수명 : $var1"
변수명 : abcde
(base) itwill@ubuntu:~/linux_ex/ch9/test$ echo '변수명 : $var1'
변수명 : $var1
05 논리 연산자
-01 and 연산자
if [ $var1 -ge 1 -a $var1 -le 100 ] # -a 가 and 연산자
혹은
if [ $var1 -ge 1 ] && [ $var1 -le 100 ]
vi 21_and.sh
#!/bin/sh
var1=100
#if [ $var1 -ge 50 -a $var -le 100 ]
if [ $var1 -ge 50 ] && [ $var1 -le 100 ]
then
echo " 50 <= x <=100"
else
echo "False"
fi
(base) itwill@ubuntu:~/linux_ex/ch9$ sh 21_and.sh
50 <= x <=100
-02 or 연산자
if [ $var1 -ge 1 -o $var1 -le 100 ]
if [ $var1 -ge 1 ] || [ $var1 -le 100 ]
'아이티윌_데이터 분석 55기 > 강의내용_Linux' 카테고리의 다른 글
| #7 7일차_반복 제어문, sed, awk (0) | 2026.07.23 |
|---|---|
| #5 5일차_반복문, 산술연산, 색 변수 설정, 지역변수/전역변수, 아나콘다 설치 (0) | 2026.07.21 |
| #4 4일차_서버 이식, if/case, windcp, 유저생성/소유자 변경, find, 리다이렉션, crontab (0) | 2026.07.20 |
| #3 환경설정 및 변수선언, 권한설정, 조건문 (0) | 2026.07.16 |
| #2 2일차_편집기 및 디렉토리 / 파일 확인하기 / 패턴 검색 / 파이프 (0) | 2026.07.15 |