아이티윌_데이터 분석 55기/강의내용_Linux

#6 6일차_파이썬 스크립트 실행, 로깅 처리, 정렬, 특수기호 정의

ecosso 2026. 7. 22. 16:13

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 ]