728x90

pip 가 참 많은 일을...

 

Python 을 조금씩 좋은 감정으로 알아가고 있는 중입니다. 결실을 맺게 될지는 잘 모르겠지만 오늘도 새롭게 공부한 것들이 있어서 공유해 봅니다. Python 에서 Package 관리를 위해 사용하는 것이 pip 혹은 pip3 입니다. npm 과 같은 Package 관리자라고 생각하니 마음이 편해졌습니다.

 

npm 에서는 프로젝트 루트 경로의 package.json 에 패키지를 기술해두고 npm install 명령으로 패키지를 쉽게 설치할 수 있었는데요, pip 에는 그런 기능이 없나 하고 살펴보니 역시나 제공하고 있었습니다. 당연한 것을 이렇게 하나씩 알아가는 것도 새로운 개발 환경을 익히고 배우는 재미이겠지요.

 

// 패키지의 목록을 출력
$ pip freeze
boto3==1.12.24
botocore==1.15.24

// 패키지의 목록을 requirements.txt 에 저장
$ pip freeze > requirements.txt

 

먼저 pip 의 freeze 를 이용하여 사용중인 패키지를 확인할 수 있습니다. 가상 환경을 적절히 분리해 두지 않았다면 전역으로 설치된 모든 패키지의 목록이 나오는 것처럼 보입니다. 아직 Python 가상환경에 익숙치 않아서... 대충 그렇게 돌아가는 것처럼 보이는 느낌입니다 ㅎㅎ.

 

$ pip install -r requirements.txt

 

requirements.txt 파일은 `패키지명=버전` 혹은 `패키지명` 으로 패키지에 대하여 기술한 목록 파일입니다. NodeJS 에서는 package.json 에 JSON 형태로 모듈명과 버전명을 기술했던 것에 비해 단순합니다. pip install 명령을 -r #패키지목록# 형태로 실행하면 지정되어 있는 패키지의 버전을 찾아 설치하게 됩니다. 참 쉽죠? 

 

 

728x90
728x90

 

델리미터(Delimeter)로 컬럼이 분기된 텍스트 파일(보통은 아마도 로그파일)을 다룰 때 가장 손쉽게 쓸 수 있는 도구가 awk 입니다. 물론 cut 등도 있지만 탐색한 이후의 작업을 주로 담당하기 때문에 탐색시에는 역시 awk 가 대세입니다. (당연하겠습니다만 awk 도 정규표현식의 탐색을 지원하니 자세한 내용은 글 맨 아래의 포스팅 링크를 참고해 주세요.)

 

 

awk 에서 특정 컬럼의 값을 표현하는 방법은 여러가지가 있습니다. 그동안 많이 사용했던 패턴은 아래와 같은 방식이었는데요 이 방식에서도 or, and 조건을 사용하는 것은 문제가 없습니다. 조건을 동시에 만족하는 경우를 찾으려면 &&를, 어느 하나라도 만족하는 경우를 찾으려면 || 를 사용하면 됩니다. 

 

// AND (&&)
awk '$2=="" && $19~/my/ {print $11, $24}'

// OR (||)
awk '$2=="" || $19~/my/ {print $11, $24}'

 

이렇게 표현하는 방법 외에 브레이스({}) 안쪽에 if 문을 넣어서 사용하는 방법도 있습니다. 어느 방법을 사용하던 원하는 결과를 얻을 수 있으면 되니 손에 더 감기는 방법을 사용하면 좋을 것 같습니다. NOT 조건을 사용하는 경우에도 보다 쉽고 명시적으로 읽을 수 있어서 이 방법을 개인적으로는 선호하는 편입니다. 

 

// AND (&&)
awk '{ if ($5=="/test" && $3=="GET") print $0}' 

// OR (&&)
awk '{ if ($5=="/test" || $5=="/beta") print $0}' 

// NOT (!)
awk '{ if (!($5=="/test")) print $0}' 

 


 

쉘 스크립트 - awk 에서 정규 표현식 사용하기

쉘에서 로그와 같은 텍스트 파일을 다룰때 정규표현식을 자주 사용하게 됩니다. 정규표현식을 지원하는 쉘의 도구들은 여러가지가 있는데요 오늘은 awk 에서 정규표현식을 사용하는 방법을 간단하게 살펴보겠습니..

ondemand.tistory.com

 

728x90
728x90

네, 없습니다.. ㅡ,.ㅡ;

 

전통적인(?) 많은 개발 언어에서 <증감연산자>를 사용해 왔습니다.

++ 혹은 -- 로 표기되는 <증감연산자>는 <3항 연산자>와 마찬가지로

코드의 양을 많이 줄여줄 수 있는 장점이 있어 널리 사용됩니다.

 

가령 아래의 코드와 같은 방법으로 반복문에서 많이 사용되고 있고

반복적인 작업을 처리하는 로직 내에서도 ++ 혹은 -- 로 

카운트의 값을 변경하는 목적으로 널리 애용되고 있습니다. 

 

for (int i=0; i<100; i++) {}

 

그런데!

 

Python 에서는 <증감연산자>가 사용되지 않고 존재하지 않는다는 사실.

오랫동안 Python 을 다뤄오신 분들에게는 "당연한거 아니야?" 라는 반응이 나오겠습니다만

어쩌다 한 번 Python 으로 코드를 만들어야 하는 일이 생기는 분들이라면

존재하지 않는 <증감연산자>에 당황할 수 있습니다... 네, 제가 그랬으니 이 글을 쓰고 있...

Python 에는 아래와 같은 방식으로 for 문을 대체하는 것이 일반적이더군요.

 

for i in range (0,99):
	# blah blah...

 

 

반복문이 아닌 경우에는 어떻게 하면 될까요?

갑자기 쓰려니 공식 명칭이 떠오르지 않습니다만 += 나 -= 는

다른 언어에서와 마찬가지로 Python 에서도 사용되는 연산자입니다. 

 

# 다른 언어
i++;
i--;
++i;
--i;

# Python
i += 1
i -= 1

 

Python 은 누구나 쉽게 읽을 수 있고 명료한 코드를 추구한다고 합니다.

<증감연산자>는 분명 간편하지만 전위인지, 후위인지에 따라

실제 값이 어느 타이밍에 바뀌느냐로 굉장히 골머리를 썩었던 경험들이 다들 있을겁니다.

C 언어에서의 포인터 급은 아니지만 처음 개발에 입문할 때 꽤 많은 오류를 만들었던 기억이 납니다.

혹시나 생길 수 있는 코드 해석의 차이를 없애주는 착한 Python 입니다. 

 


 

혼자 공부하는 파이썬:파이썬 최신 버전 반영

COUPANG

www.coupang.com

 

Visual Studio Code 에서 Python 패키지의 Unresolved Import Error 를 처리하는 방법

코드를 만들 필요가 있을때 왠만하면 Node.js 를 이용하는 편입니다. 아무래도 익숙하기도 하거니와 자유로운 자바스크립트의 DNA 가 살아 있기 때문에 "대략 이렇게 돌아갈까?" 하는 것들이 동작하기 때문입니다...

ondemand.tistory.com

 

맥에서 파이썬 개발환경 준비하기

파이썬은 2.x 대와 3.x 대가 있는데, 서로 호환성이 없음 일반적으로 많이 사용되는 2.x 대를 설치 - 설치안내 : http://python.org/download/releases/2.7.6/ 파이썬 패키지 관리도구 : easy_install, pip pip 는..

ondemand.tistory.com

 

본 포스팅은 소정의 수수료를 받을 수 있습니다

 

728x90
728x90

종종 사용하지만 매일 사용하지 않는 명령이나 옵션들이 많습니다.

금방 기억이 나면 좋으련만 나이가 들어가는지 매번 구글의 도움을 받게 되네요.

겸사겸사 블로그에 기록해 두고 저와 비슷한 기억력 감퇴를 겪는 분들에게

일말의 도움을 주고자 이렇게 시간을 할애해 봅니다. (훗)

 

 


리눅스나 맥 환경에서 grep 은 정말 유용한 명령입니다.

텍스트 파일에서 필요한 내용을 찾아내는데 도사이기 때문이죠.

간단한 사용법은 cat 등으로 텍스트 파일을 읽고

파이프로 grep 을 연결해서 필요한 필터 조건을 거는 방법입니다. 

 

// "NoPD" 가 들어간 행을 찾습니다
$ cat test.txt | grep NoPD

 

만약 대량의 로그파일에서 필요한 내용을 찾으려면 어떻게 해야 할까요?

단순한 웹 엑세스 로그라면 위와 같은 방법에 한번 더 파이프로 awk 를 연결하면 되겠습니다만 

Java 의 trace 로그라던가 debug 성격의 로그라면 

에러 문자열 앞뒤에 있는 여러 행을 또 찾아야 합니다.

 

이럴때 써먹을 수 있는 grep 의 좋은 옵션이 있었으니

After 를 상징하는 -A 와 Before 를 나타내는 -B 옵션이 우리의 구세주입니다. 

아래와 같은 파일이 있다고 해보겠습니다. 

 

$ cat test.txt
03/23	1
03/23	2
03/23	3
03/23	4
03/23	separator
03/23	5
03/23	6
03/23	7
03/23	8

 

우리는 separator 라는 문자를 찾도록 grep 을 이용할 겁니다.

그리고 여기에 -A 와 -B 옵션을 이용해서

separator 문자열 앞 뒤의 행들을 같이 결과로 출력해 보겠습니다. 

 

// separator 문자열이 포함된 행 바로 뒤(After)의 4개 행을 출력합니다. 
$ cat test.txt | grep -A 4 separator
03/23	separator
03/23	5
03/23	6
03/23	7
03/23	8

// separator 문자열이 포함된 행 바로 직전(Before)의 4개 행을 출력합니다.
$ cat test.txt | grep -B 4 separator
03/23	1
03/23	2
03/23	3
03/23	4
03/23	separator

 

네, 참 쉽고 편리합니다.

만약 separator 가 여러개 있다면 어떻게 될까요?

 

// separator 가 여러 행에 존재하는 파일
$ cat test.txt
03/23	1
03/23	2
03/23	3
03/23	4
03/23	separator
03/23	5
03/23	6
03/23	7
03/23	8
03/24	separator
03/24	9
03/24	10
03/24	11
03/24	12

// 모든 separator 를 찾아 이후(After) 4개의 행을 출력합니다. 친절하게 -- 로 행 나눔까지...
$ cat test.txt | grep -A 4 separator
03/23	separator
03/23	5
03/23	6
03/23	7
03/23	8
--
03/24	separator
03/24	9
03/24	10
03/24	11
03/24	12

// 모든 separator 를 찾아 이전(Before) 4개의 행을 출력합니다. 역시... 친절합니다. 
$ cat test.txt | grep -B 4 separator
03/23	1
03/23	2
03/23	3
03/23	4
03/23	separator
--
03/23	5
03/23	6
03/23	7
03/23	8
03/24	separator


알아서 척척척 일을 잘 해줍니다.

before, after... 로 grep 의 -B, -A 옵션을 기억합시다!!

728x90

+ Recent posts