[Python] IPython을 사용한 Unix/Linux 셸 명령어 실행 - (IPython.utils.SList에 대하여)
IPython 설치는 설치 프로그램에 따라 다음과 같이 설치합니다.
brew install ipython
conda update conda conda update ipython pip install ipython[all] pip3 install ipython[all] |
cs |
IPython
iPython은 파이썬의 기본 대화형 쉘의 기능을 향상 시킨 도구입니다. 단순한 편의 기능이 몇 가지 추가된 수준이 아니라 최적화, 디버깅, 코드 편집과 탐색에 있어서 많은 양의 개선된 기능들을 포함하고 있습니다.
IPython을 이용하면 셸 명령어를 실행할 수 있는데, 이는 IPython 셸에서 데브옵스 작업을 수행하는 가장 큰 이유입니다. IPython이 셸 명령어를 구분하기 위해 '!' 문자를 명령어 앞에 사용합니다.
# 예시
In [1]: var_ls = !ls -l In [2]: type(var_ls)
Out[2]: IPython.utils.text.SList
In [3]: var_ls
Out[3]:
['total 0',
'drwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT',
'drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code',
'drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md',
'drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서']
|
cs |
위에서 명령어의 출력은 파이썬 변수 var_ls 에 할당되며 이 변수의 type은 IPython.utils.text.SList 입니다.
IPython.utils.SList
SList 타입은 일반 셸 명령을 3개의 메인 메서드 fields, grep, sort를 갖는 객체로 변환합니다. 일반 리스트 객체와 유사하지만 다음과 같은 속성도 가집니다.
- .l (or .list) : value as list (the list itself).
- .n (or .nlstr): value as a string, joined on newlines. (줄바꿈을 기준으로 합친 str 자료형으로 반환)
- .s (or .spstr): value as a string, joined on spaces.(공백을 기준으로 합친 str 자료형으로 반환)
- .p (or .paths): list of path objects (requires path.py package)
예시
In [51]: var_ls.l
Out[51]:
['total 0',
'drwxr-xr-x@ 8 kimjihwan staff 256 1 13 22:14 GIT',
'drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code',
'drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md',
'drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서']
In [52]: var_ls.n
Out[52]: 'total 0\ndrwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT\ndrwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code\ndrwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md\ndrwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서'
In [53]: var_ls.s
Out[53]: 'total 0 drwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서'
In [54]: var_ls.p
Out[54]: []
|
cs |
fileds(*fileld)
Slist에서 공백으로 필드를 구분하고, 필드 번호를 매겨서 원하는 필드만 가져옵니다. 예를들어 !ls -ld의 결과가 다음과 같을 때 feilds()를 이용하여 다음과 같이 사용할 수 있습니다.
In [8]: var_ls = !ls -l
In [9]: var_ls
Out[9]:
['total 0',
'drwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT',
'drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code',
'drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md',
'drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서']
In [10]: var_ls.fields(0)
Out[10]: ['total', 'drwxr-xr-x@', 'drwxr-xr-x', 'drwxr-xr-x@', 'drwxr-xr-x']
In [11]: var_ls.fields(1, 0)
Out[11]: ['0 total', '8 drwxr-xr-x@', '6 drwxr-xr-x', '7 drwxr-xr-x@', '6 drwxr-xr-x']
In [12]: var_ls.fields(-1)
Out[12]: ['0', 'GIT', 'Code', 'md', '문서']
|
cs |
결과 값을 0부터 index를 매기고 해당 index로 원하는 필드(열)만 가져올 수 있습니다. -1은 파이썬 문법과 동일하게 가장 마지막 index를 의미합니다.
grep(pattern, prune=False, field=None)
Slist에서 패턴과 일치하는 모든 문자열을 반환합니다. prune=True 인 경우 패턴과 일치하지 않는 모든 항목을 반환합니다. feild 파라미터에 원하는 필드에서만 패턴을 찾도록 지정할 수 도 있으며 pattern 파라미터에 python의 lambda 함수 또한 사용할 수 있습니다.
In [40]: var_ls
Out[40]:
['total 0',
'drwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT',
'drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code',
'drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md',
'drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서']
In [41]: var_ls.grep(lambda x: x.startswith("drwxr-xr-x@"))
Out[41]:
['drwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT',
'drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md']
In [42]: var_ls.grep(lambda x: x.startswith("drwxr-xr-x@"), prune=True)
Out[42]:
['total 0',
'drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code',
'drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서']
In [43]: var_ls.grep("md", field=-1)
Out[43]: ['drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md']
|
cs |
sort(field=None, nums=False)
SList를 특정 필드를 기준으로 정렬합니다. 필드가 숫자인 경우 nums=True 로 지정합니다. 기본 오름차순으로 정렬됩니다.
In [46]: var_ls
Out[46]:
['total 0',
'drwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT',
'drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code',
'drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md',
'drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서']
In [47]: var_ls.sort(field=1, nums=True)
Out[47]:
['total 0',
'drwxr-xr-x 6 kimjihwan staff 192 1 21 04:05 문서',
'drwxr-xr-x 6 kimjihwan staff 192 12 29 13:23 Source Code',
'drwxr-xr-x@ 7 kimjihwan staff 224 9 27 22:10 md',
'drwxr-xr-x@ 8 kimjihwan staff 256 1 13 23:14 GIT']
|
cs |
사용 예시
다음은 유닉스의 df 명령어를 사용한 예시 입니다.
다음의 sort 메서드는 이 유닉스 명령을 해석해서 세 번째 열을 크기 기준으로 정렬합니다.
In [6]: var_df = !df
In [7]: var_df
Out[7]:
['Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on',
'/dev/disk3s1s1 478724992 43596624 191563792 19% 553781 2393071179 0% /',
'devfs 405 405 0 100% 702 0 100% /dev',
'/dev/disk3s6 478724992 40 191563792 1% 0 2393624960 0% /System/Volumes/VM',
'/dev/disk3s2 478724992 639240 191563792 1% 234 2393624726 0% /System/Volumes/Preboot',
'/dev/disk3s4 478724992 1173920 191563792 1% 188 2393624772 0% /System/Volumes/Update',
'/dev/disk1s2 1024000 12328 986208 2% 3 5119997 0% /System/Volumes/xarts',
'/dev/disk1s1 1024000 15120 986208 2% 18 5119982 0% /System/Volumes/iSCPreboot',
'/dev/disk1s3 1024000 624 986208 1% 29 5119971 0% /System/Volumes/Hardware',
'/dev/disk3s5 478724992 237890808 191563792 56% 1102447 2392522513 0% /System/Volumes/Data',
'map auto_home 0 0 0 100% 0 0 100% /System/Volumes/Data/home',
'/dev/disk3s1 478724992 43596624 191563792 19% 553788 2393071172 0% /System/Volumes/Update/mnt1',
'/Users/kimjihwan/Downloads/Sublime Text.app 478724992 237869288 191585312 56% 1102440 2392522520 0% /private/var/folders/4p/hh2dnp410s7f099rrpwn8s0c0000gn/T/AppTranslocation/E342E303-FD92-41EE-8EF8-26F5AB985373']
In [8]: var_df.sort(3, nums=True)
Out[8]:
['Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on',
'devfs 405 405 0 100% 702 0 100% /dev',
'map auto_home 0 0 0 100% 0 0 100% /System/Volumes/Data/home',
'/dev/disk1s1 1024000 15120 986208 2% 18 5119982 0% /System/Volumes/iSCPreboot',
'/dev/disk1s2 1024000 12328 986208 2% 3 5119997 0% /System/Volumes/xarts',
'/dev/disk1s3 1024000 624 986208 1% 29 5119971 0% /System/Volumes/Hardware',
'/dev/disk3s1 478724992 43596624 191563792 19% 553788 2393071172 0% /System/Volumes/Update/mnt1',
'/dev/disk3s1s1 478724992 43596624 191563792 19% 553781 2393071179 0% /',
'/dev/disk3s2 478724992 639240 191563792 1% 234 2393624726 0% /System/Volumes/Preboot',
'/dev/disk3s4 478724992 1173920 191563792 1% 188 2393624772 0% /System/Volumes/Update',
'/dev/disk3s5 478724992 237890808 191563792 56% 1102447 2392522513 0% /System/Volumes/Data',
'/dev/disk3s6 478724992 40 191563792 1% 0 2393624960 0% /System/Volumes/VM',
'/Users/kimjihwan/Downloads/Sublime Text.app 478724992 237869288 191585312 56% 1102440 2392522520 0% /private/var/folders/4p/hh2dnp410s7f099rrpwn8s0c0000gn/T/AppTranslocation/E342E303-FD92-41EE-8EF8-26F5AB985373']
|
cs |
결과를 살펴보면 var_df 변수에 df 명령어의 결과가 저장되었고, var_df.sort(3, nums=True) 는 var_df에 저장된 결과를 3번째 열(Available)을 기준으로 정렬하여 출력합니다.
다음과 sort와 field 명령어를 같이 사용해서 df의 FileSystem, Available,Capacity 필드만 가져오는 예시 입니다.
In [19]: sorted_var_df = var_df.sort(3, nums=True)
In [20]: sorted_var_dfs
Out[20]:
['Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on',
'devfs 405 405 0 100% 702 0 100% /dev',
'map auto_home 0 0 0 100% 0 0 100% /System/Volumes/Data/home',
'/dev/disk1s1 1024000 15120 986208 2% 18 5119982 0% /System/Volumes/iSCPreboot',
'/dev/disk1s2 1024000 12328 986208 2% 3 5119997 0% /System/Volumes/xarts',
'/dev/disk1s3 1024000 624 986208 1% 29 5119971 0% /System/Volumes/Hardware',
'/dev/disk3s1 478724992 43596624 191563792 19% 553788 2393071172 0% /System/Volumes/Update/mnt1',
'/dev/disk3s1s1 478724992 43596624 191563792 19% 553781 2393071179 0% /',
'/dev/disk3s2 478724992 639240 191563792 1% 234 2393624726 0% /System/Volumes/Preboot',
'/dev/disk3s4 478724992 1173920 191563792 1% 188 2393624772 0% /System/Volumes/Update',
'/dev/disk3s5 478724992 237890808 191563792 56% 1102447 2392522513 0% /System/Volumes/Data',
'/dev/disk3s6 478724992 40 191563792 1% 0 2393624960 0% /System/Volumes/VM',
'/Users/kimjihwan/Downloads/Sublime Text.app 478724992 237869288 191585312 56% 1102440 2392522520 0% /private/var/folders/4p/hh2dnp410s7f099rrpwn8s0c0000gn/T/AppTranslocation/E342E303-FD92-41EE-8EF8-26F5AB985373']
In [21]: sorted_var_df.fields(0, 3, 4)
Out[21]:
['Filesystem Available Capacity',
'devfs 0 100%',
'map 0 0',
'/dev/disk1s1 986208 2%',
'/dev/disk1s2 986208 2%',
'/dev/disk1s3 986208 1%',
'/dev/disk3s1 191563792 19%',
'/dev/disk3s1s1 191563792 19%',
'/dev/disk3s2 191563792 1%',
'/dev/disk3s4 191563792 1%',
'/dev/disk3s5 191563792 56%',
'/dev/disk3s6 191563792 1%',
'/Users/kimjihwan/Downloads/Sublime 237869288 191585312']
|
cs |
위의 예시는 var_df를 3번째 열을 기준으로 정렬한 sorted_var_df에 저장합니다. 그리고 sorted_var_df.fields(0, 3, 4)는 sorted_var_df의 결과에서 0, 3, 4번째 필드만 가져옵니다.
마지막으로 Slist의 grep을 사용한 예시입니다. /usr/bin에 설치된 명령 파일중 이름에 kill이 포함된 파일을 찾는 예시 입니다.
In [56]: var_ls_bin = !ls -l /usr/bin
In [57]: var_ls_bin.grep("kill")
Out[57]:
['-rwxr-xr-x 1 root wheel 1621 1 1 2020 kill.d',
'-rwxr-xr-x 1 root wheel 122272 1 1 2020 killall',
'-rwxr-xr-x 1 root wheel 141136 1 1 2020 pkill']
|
cs |
IPython을 이용한 리눅스/유닉스 쉘 스크립트 사용 방법에 대하여 알아보았습니다.
참고
https://ipython.readthedocs.io/en/stable/api/generated/IPython.utils.text.html