Command line tools 한국어정보의전산처리 2019. 3. 19.
command line tool 을사용하기위한환경 Unix 및이를 PC 에서구현한운영체제인 Linux 는 command line/ 터미널이기본적인사용자인터페이스 (UI) 임. MS-DOS 는이를조악하게모방한것. Unix/Linux 와 DOS 의차이 줄바꿈문자 : LF 대 CR-LF 경로구분자 (path separator): 슬래시 (/) 대역슬래시 (\: 폰트에따라 \ 로보임 ) 아이콘, 메뉴를마우스로클릭하는방식의 GUI 를 Apple 社의 Macintosh 에서처음으로구현. 이방식이 MS-Windows, Linux 의 X-Windows 에도채용됨. MS-Windows 운영체제에서제공하는기본적인 command line 인터페이스 : 명령프롬프트 (cmd) (DOS 를계승한것 ), powershell MS-Windows 에서 Unix/Linux 의 command line 을흉내낸 (emulate) 것 : Cygwin
Cygwin 이란? Windows 운영체제에서 Linux 비슷한 command line 환경을제공하고 Linux 의기본 command line tool 들을사용할수있게해주는 emulator Linux 의기본 command line tool 들은 GNU 프로젝트에서관리해왔는데 Cygnus 라는회사에서이것을 Windows 용으로 porting 하여제공했음. 그래서 Cygwin 이라는이름이붙었음. Cygnus 社는 Redhat Linux 에합병되었으나, Cygwin 은계속유지, 관리되고업데이트되고있음. https://www.cygwin.com/ Cygwin 과비슷한대안 : UnxUtils, DJGPP, MKS Toolkit, AT&T UWIN 등
command line tool 의철학 (Unix 철학 ) Do one thing well 한가지일만잘하는소프트웨어는디자인 / 유지 / 관리하기가쉬움. 복잡한일을처리하려면복수의 tool 을 pipe 로연결해서쓰면됨. Process lines of text, not binary 텍스트파일은보편적이고다루기쉬움. Use regular expressions 텍스트처리의강력한도구인정규표현을적극활용함. Default to standard I/O 표준입력과표준출력을 default 로사용. 파일입출력을원하면명시. Don t be chatty start processing, ~% processed, finished 같은메시지를출력하지않음. 그런메시지는, 여러 tool 들을 pipe 로연결해서쓸때오히려장애요인이됨. Generate the same output format accepted as input
Cygwin 설치절차 (Ubuntu 사용자는불필요 ) Cygwin 홈페이지에서설치파일을다운로드하여실행함으로써설치할수있음. 32 비트용 : setup-x86.exe 64 비트용 : setup-x86_64.exe Cygwin 에는방대한 tool 들이포함되어있기때문에, 설치과정에서설치를원하는 tool 들을선택할수있음. Cygwin 을이미설치한뒤에도, setup 파일을다시실행하여 tool 들을추가로설치하거나, 이미설치된 tool 들을업데이트할수있음. setup 파일을실행하여 Select Packages 단계에서 Category 별로 tool 들의목록을보고원하는것을선택함. Base 범주에있는것은사용자가일부러선택하지않아도 default 로설치됨. Interpreters 범주에서 python, python3, ruby 를선택. Math 범주에서 bc, R 을선택. Net 범주에서 curl 을선택. Text 범주에서 jq, pcre, pcre2 를선택. Utils 범주에서 diffutils 를선택. Web 범주에서 wget 을선택. Devel 범주에서 git 를선택.
Cygwin 설치후의관리 (Ubuntu 사용자는불필요 ) (64 비트용을설치했다면 ) c:/cygwin64/bin 에실행파일 (~.exe) 과 DLL 들이들어있음. Cygwin 의환경설정에서이디렉토리가지정되어있기때문에, 이디렉토리에있는실행파일은어느디렉토리에서든접근가능함. 다른실행파일도이디렉토리에복사해넣으면같은효과를가짐. Cygwin 터미널을실행했을때의초기디렉토리는 c:/cygwin64/home/username ( 이탤릭체부분은가변적 ) 임. Ubuntu 에서터미널을실행했을때의초기디렉토리는 /usr/home/username ( 이탤릭체부분은가변적 ) 임. Ubuntu 에서는 GUI 의디렉토리탐색기에서특정디렉토리로가서터미널을열수도있음.
터미널사용을위한초기세팅 Ubuntu 에서소프트웨어나라이브러리설치시에는 passwor 를입력하는사용자절차를필요로함. 설치명령앞에 sudo 를추가함. python 으로제작된 tool 이나 library 를설치할때 pip 이라는 tool 을흔히사용함. sudo apt-get install python-pip (pip 이설치되어있지않으면설치함 ) Cygwin 명령 : python -m ensurepip sudo pip install -U pip (pip 을최신버전으로업그레이드함 ) Cygwin 명령 : python m pip install U pip sudo pip install ~~ (~~ 라는 python tool/library 를설치함. 예 : csvkit) 중요한약호의의미. current directory.. one-level higher directory
디렉토리이동 : cd cd : 디렉토리이동 cd.. 한단계상위디렉토리로이동 cd../.. 두단계상위디렉토리로이동 cd abc 현재디렉토리로부터그안에있는 abc 디렉토리로이동 cd../../../abc 세단계상위디렉토리안에있는 abc 디렉토리로이동 주로 relative path 사용. absolute path도사용가능 : cd /usr/home/username/abc cd /media/username/ 외장하드레이블외장하드의최상위디렉토리로이동 DOS 명령어 cd 도거의비슷하나약간차이있음. cd.. 띄어쓰지않아도됨. cd\ 현재드라이브의최상위디렉토리로이동 d: d 드라이브로이동 해당드라이브로처음이동하는것이라면최상위디렉토리로이동. 그드라이브의특정디렉토리에있다가드라이브를변경했다면그디렉토리로이동. 상위디렉토리와하위디렉토리를구분하는기호 (path separator) 가 / 대신 \ 임.
파일및디렉토리관리 ls : 현재디렉토리에들어있는디렉토리및파일목록을출력함. ls -l : 각디렉토리 / 파일의상세정보까지함께출력함. 유사한 DOS 명령어 : dir mkdir ~~: 현재디렉토리에 ~~ 라는하위디렉토리를만듦. 유사한 DOS 명령어 : md rmdir ~~: 현재디렉토리에존재하는 ~~ 라는하위디렉토리를삭제함. 유사한 DOS 명령어 : rd cp source target : source 파일을 target 디렉토리에복사함. cp xyz abc 현재디렉토리에있는파일 xyz 가 abc 디렉토리안에복사됨. cp../abc/def.../abc 디렉토리에있는파일 def 가현재디렉토리에복사됨. target 이라는디렉토리가없으면, target 이라는파일을만듦. 이파일의내용은 source 와동일함. target 은 디렉토리 / 파일 일수도있음. 유사한 DOS 명령어 : copy ( 여러파일을통합할때도쓸수있음. 후술 ) mv source target : source 파일을 target 디렉토리로이동함. target 이라는디렉토리가없으면, 파일명을 source 에서 target 으로바꿈. rm ~~: 현재디렉토리에존재하는 ~~ 라는이름의파일을삭제함. 유사한 DOS 명령어 : del
아무개문자 (wild card) 특정문자가아니라임의의문자를지칭할수있는특수문자? 1 개의임의의문자 * 임의의개수의임의의문자 명령어뒤에써주는문자열을 command line argument 라고함. 명령어뒤에하이픈과함께써주는것은실행옵션을지정하는 switch 임. command line argument 는완전히확정된특정문자열일수도있고 rm abc : abc 라는이름의파일 1 개만삭제함. 아무개문자를포함한문자열일수도있음. rm ab? : ab~ 라는이름의모든파일을삭제함. rm ab* : ab 로시작되는이름의모든파일을삭제함. rm *.jpg : 확장자가 jpg 인 ( 즉이름이.jpg 로끝나는 ) 모든파일을삭제함. ls *.txt : 현재디렉토리에있는, 확장자가 txt 인파일들의목록을출력함. 아무개문자는이렇게특수목적에사용되기때문에, 파일이름에사용할수없음.
파일, 변수내용출력 cat abc : abc 파일의내용전체를화면에출력함. head abc : abc 파일의첫 10 줄을화면에출력함. head -(n ) 숫자 abc : abc 파일의첫 숫자 줄을화면에출력함. tail abc : abc 파일의끝 10 줄을화면에출력함. tail (n ) 숫자 abc: abc 파일의끝 숫자 줄을화면에출력함. echo : command line argument( 의내용 ) 을화면에출력함. myvar=xyz123abc echo $myvar ( 화면에 xyz123abc 를출력함. 변수이름앞에 $ 를붙임 ) printf : formatted printing/output 포맷지정방법 : %c 문자, %d 정수, %f 실수 %04d 정수를네자리로출력. 네자리미만이면앞에 0 을붙여서네자리로맞춤 %.4f 실수의소수점이하를네자리로출력. 네자리를초과할경우반올림하여맞춤 myvar=123.456789 printf my variable is %.4f $myvar (my variable is 123.4568 을출력함 ) printf my variable is %.2f $myvar (my variable is 123.46 을출력함 ) 대개의프로그래밍언어 (C, perl, python, ruby 등 ) 에서 printf 함수를제공함.
redirection : 입출력방향바꾸기 command line tool 의 default 입력장치는키보드 (standard input) 이고, default 출력장치는콘솔 ( 터미널 ) 화면 (standard output) 임. 입력장치를파일로바꾸고자할때 : <input_file 출력장치를파일로바꾸고자할때 >output_file (output_file 이라는이름의파일이이미존재하면 overwrite) >>output_file (output_file 이라는이름의파일이이미존재하면 append) 입력장치가파일일때, 입력파일을지정하는방법 cat input_file ( 대개의명령어는 < 를쓰지않아도첫째 command line argument 를입력파일로인식함 ) cat <input_file (< 를써주면입력장치가파일임이더명확함. tr 은 < 를써야함 ) <input_file cat (< 입력파일을명령어앞에써도됨. 이때는 < 가필수적.) pipe 로복수의명령어를연결해서쓸때는이방식이더직관적임. <input sort uniq 대 sort input uniq : 후자보다전자가더직관에부합됨.
파일통합, 분리 cat file1 file2 file3 : command line argument 에제시된파일들을통합함. 통합결과는 default 로화면에출력됨. redirection 으로출력파일을지정하면파일로저장됨. cat f1 f2 >output 아무개문자사용가능 : cat *.txt >output ( 현재디텍토리에있는확장자가 txt 인모든파일을통합하여 output 이라는이름으로저장 ) cat 명령어는파일내용출력, 파일통합이라는 2 개의과제를수행하므로 Do one thing well 이라는 Unix 철학에위배되는예라고할수도있겠으나 기본기능은파일내용출력이고그입력이파일 1 개일수도있고여러개일수도있다고보면 Unix 철학위반이아님. DOS 명령어 copy 로도파일통합을할수있음. (Unix 철학위반 ) copy *.txt output split input : input 파일을일정한크기 ( 라인수 ) 의파일들로쪼갬. default 라인수는 1000. split -(l ) 숫자 : 숫자만큼의라인수로쪼갬. output 파일들은 xaa, xab, xac,..., xaz, xbb, xba,..., xzz 식으로이름이붙여짐.
line 번호붙이기 nl input : input 파일의각라인에순차적으로라인번호를붙임. 라인번호와본래의라인사이에는 default 로탭을넣음. 스위치 s 로지정가능. 비어있는라인에는번호를붙이지않음. 이러한 default 행동을스위치 -l 로조정가능. 주의 : 줄바꿈문자가 CR-LF 로되어있으면, CR 때문에빈줄로인식하지않음. 줄바꿈문자가 LF 로되어있어야빈줄이빈줄로인식됨. cat -n input : nl 과동일하나, 비어있는라인에도번호를붙임. cat 이파일내용출력과라인번호붙이기라는 2 개의기능을하므로, Unix 철학위반이라고볼수도있음. 기본기능은파일내용출력인데, 라인번호붙이기라는부가기능을추가로수행할수도있는것으로보면, 위반이아니라고할수도있음. EmEditor 32 비트용 Plug-in 중에비슷한기능을하는것이있음. 행두삽입, 행말삽입등가능. 라인번호앞이나뒤에특정문자추가가능. 텍스트에디터의설정에서라인번호가보이게할수있음.
sort 입력파일의각라인을일정한기준에따라순서를배열 / 정렬해줌. default 는문자열 (string) 의사전순비교 (lexicographic comparison) 에의한오름차순 (ascending order) 정렬 -f : 대소문자구별안함. 소문자를대문자로간주하여정렬. -g 또는 -n : 문자열대신숫자값 (numeric value) 에의한정렬. -g : general numeric, -n : numeric -r : (reverse) 내림차순 (descending order) 정렬 -u : (unique) 정렬한결과동일한라인이연속해서나오면중복라인을삭제하여각라인을 unique 하게만듦. -k 숫자 : 숫자번째필드를기준으로정렬함. -t ~ : 필드구분자를 ~ 로함. 복수의스위치를결합해서사용할수있음.
통계정보추출 wc : (word count) 파일의크기에대한수치정보출력 default 로라인수, 단어수, 바이트수출력 wc -l 라인수, wc -w 단어수, wc -c 바이트수, wc -m 문자수 아스키문자만들어있으면 wc -c 의결과와 wc -m 의결과가일치하나 아스키이외의문자 (2 바이트이상의문자 ) 가있으면결과가다름. uniq : 동일한라인이연속해서나오면중복라인을삭제하여각라인을 unique 하게만듦. sort -u 는 sort uniq 와동일한기능을함. 그러나 uniq 는 sorting 된결과뿐아니라 unsorted input 에도적용가능. 그러므로기능이완전히같다고할수없음. 스위치 -c : (count) 연속해서나온동일한라인의수를함께출력함. 스위치 -i : 대소문자구분안함.
문자바꾸기 : tr (translate) tr 집합1 집합2 : 집합1에나열된문자들각각을집합2에나열된문자로바꿈. <input tr abc xyz : a를 x로, b를 y로, c를 z로바꿈 집합2에나열된문자의개수가모자라면, 마지막문자를반복해서개수를채움. 주의 : tr은모든문자가 1바이트문자라고전제함. 2바이트이상의문자가문자집합에제시되면이를 1바이트문자들의연쇄로인식. tr -d 집합 : (delete) 집합에나열된문자들을삭제함. <input tr -d abc : a, b, c를삭제함. tr -s 집합 (squeeze) 집합에나열된문자가, 같은것이연속해서나올때중복된것을삭제하여 unique하게만들어줌. <input tr -s abc : aa나 aaa 등을 a로, bb 등을 b로, cc 등을 c로만듦. uniq가라인차원에서하는일을문자차원에서하는셈. 스위치 -c : (complement) 문자집합에제시되지않은문자들이대치대상이됨. 문자집합의특수한지정방법 문자1-문자2 : 문자1부터문자2까지라는의미. [:space:] 모든 ( 수평및수직 ) 공백문자 [:blank:] 모든수평공백문자 [:punct:] 모든문장부호 [:digit:] 모든숫자 [:alpha:] 모든알파벳문자
pipe 두명령을 pipe 로연결하면, 앞명령의출력이뒤명령의입력이되는식으로순차적으로명령이실행됨. <input tr [:blank:][:punct:] \n sort uniq -c sort -gr tr - \n : input 파일의공백, 문장부호를모두줄바꿈문자로바꾼다. 이렇게하면하나의단어가하나의라인을구성하게됨. ( 빈줄도생김 ) sort: 소팅함. 같은단어들이한데모여연속해서나오게됨. uniq -c: 같은단어 ( 라인 ) 가연속해서나오면중복삭제하고개수를 count 함. 그러면모든단어에대해 [ 빈도, 단어 ] 형식으로출력됨. 사전순배열. sort -gr: 빈도가큰것부터내림차순으로정렬됨. 대명률직해이두문에서이두목록및빈도추출 <daminglu.txt grep "{# tr -d {#}()[:digit:] tr [:blank:]" "\n" grep "/" gawk 'BEGIN{FS="/"}{print $2}' sort uniq c {# 를포함한라인추출, {#}() 숫자삭제, 공백을줄바꿈으로대치 / 포함한라인추출, / 뒤부분만추출, 소팅, 중복삭제하면서 count
파일비교 diff file1 file2 두파일의내용을라인단위로비교하여, 차이나는부분을출력함. file1 에만있는라인은 < 기호뒤에표시하고 file2 에만있는라인은 > 기호뒤에표시함. 인터넷으로파일을공동관리할때 ( 예 : 위키백과, open source software) 파일내용수정내역을기록 / 관리하기위한용도로주로사용됨. comm file1 file2 : 차집합, 교집합출력 두파일을라인단위로비교하여 f1-f2, f2-f1, f1 f2 를 3 개의필드로나누어출력 두입력파일이 sort 되어있을것을전제로함. comm - 숫자 : 숫자번째필드를출력안함. comm - 숫자 1 숫자 2 : 숫자 1 번째필드와숫자 2 번째필드를출력안함. comm -12 : 두파일의교집합만출력 comm -23 : f1-f2, 즉 f1 에만있고 f2 에는없는라인만출력. 목록 ( 특히단어목록 ) 끼리비교하여차집합, 교집합을추출할때유용함.
네트워크로부터파일다운로드 wget url url 이가리키는네트워크상의파일을다운로드하여 원본파일이름과같은이름으로현재디렉토리에저장함. url 에파일이름에금지된문자가들어있으면, 그문자를대치하거나삭제함. 파일크기, 다운로드진척상황등을화면에보여줌. 스위치 -r : (recursive) url 의모든하위디렉토리를 recursive 하게뒤져서모든파일을다운로드함. ( 주의 : 다운로드용량및시간이엄청날수있음 ) curl url url 이가리키는네트워크상의파일을다운로드하여 그내용을화면에출력함. 파일로저장하려면리다이렉션지정. 리다이렉션을지정하더라도, 파일크기, 다운로드진척상황등을화면에보여줌. 두소프트웨어의기능이거의동일하나, 약간의장단점이있음. wget 의단점 : 파일이름을지정할수없으므로, 다운로드후파일이름바꾸기단계를거쳐야하는경우가많음. wget 의장점 : 다운로드하다가중단된경우, 자동으로다운로드를다시시도함. 두 tool 모두단독으로사용하기보다, shell script 를작성하여많은수의파일을대상으로처리할때 power 를발휘함. ( 휴식시간지정도가능 )