나는 현재 잘 기억되지 않는 AWK, sed, Bash 및 작은 Perl을 통해 텍스트 파일 조작을하고 있습니다.
나는 파이썬이 이런 종류의 일에 좋다는 몇 곳을 언급했습니다. 파이썬을 사용하여 쉘 스크립팅, AWK, sed 및 친구들을 어떻게 대체 할 수 있습니까?
나는 현재 잘 기억되지 않는 AWK, sed, Bash 및 작은 Perl을 통해 텍스트 파일 조작을하고 있습니다.
나는 파이썬이 이런 종류의 일에 좋다는 몇 곳을 언급했습니다. 파이썬을 사용하여 쉘 스크립팅, AWK, sed 및 친구들을 어떻게 대체 할 수 있습니까?
답변:
모든 쉘에는 몇 가지 기능 세트가 있습니다.
필수 Linux / Unix 명령 이들 모두는 서브 프로세스 라이브러리를 통해 사용 가능 합니다. 이것이 모든 외부 명령 을 수행하는 데 항상 최선의 선택은 아닙니다 . 또한 별도의 Linux 명령 인 일부 명령에 대해서는 shutil 을 참조하십시오. 그러나 Python 스크립트에서 직접 구현할 수도 있습니다. 또 다른 거대한 Linux 명령 배치는 os 라이브러리에 있습니다. 파이썬에서 더 간단하게 할 수 있습니다.
그리고-보너스! -- 더 빠르게. 셸에서 각각의 개별 Linux 명령 (일부 예외 제외)은 하위 프로세스를 분기합니다. 파이썬 shutil
과 os
모듈 을 사용 하면 하위 프로세스를 포크하지 않습니다.
쉘 환경 기능. 여기에는 명령 환경을 설정하는 항목 (현재 디렉토리 및 환경 변수 및 기타)이 포함됩니다. 파이썬에서 직접 이것을 쉽게 관리 할 수 있습니다.
쉘 프로그래밍 기능. 이것은 모든 프로세스 상태 코드 검사, 다양한 논리 명령 (if, while, for 등)과 테스트 명령 및 모든 친척입니다. 함수 정의 물건. 이것은 파이썬에서 훨씬 훨씬 쉽습니다. 이것은 bash를 없애고 파이썬에서 그것을하는 데 큰 승리 중 하나입니다.
상호 작용 기능. 여기에는 명령 내역 및 기타 사항이 포함됩니다. 쉘 스크립트를 작성하는 데 필요하지 않습니다. 이것은 스크립트 작성이 아니라 사람과의 상호 작용을위한 것입니다.
쉘 파일 관리 기능. 여기에는 리디렉션 및 파이프 라인이 포함됩니다. 더 까다 롭습니다. 이 중 많은 부분이 하위 프로세스로 수행 될 수 있습니다. 그러나 쉘에서는 쉬운 것들이 파이썬에서는 불쾌합니다. 특히 같은 것들 (a | b; c ) | something >result
. 이렇게하면 두 개의 프로세스가 병렬로 실행 a
되고 (입력 이 출력 됨 b
) 세 번째 프로세스가 이어집니다. 해당 시퀀스 something
의 출력이 병렬로 실행되고 출력이라는 파일로 수집됩니다 result
. 다른 언어로는 표현하기가 복잡합니다.
특정 프로그램 (awk, sed, grep 등)은 종종 파이썬 모듈로 재 작성 될 수 있습니다. 배 밖으로 가지 마십시오. 필요한 것을 교체하고 "grep"모듈을 발전 시키십시오. "grep"을 대체하는 Python 모듈 작성을 시작하지 마십시오.
가장 좋은 방법은 단계적으로 수행 할 수 있다는 것입니다.
os.walk
. 많은 프로세스를 생성하지 않기 때문에 이것은 큰 승리입니다.find
가지고있는 여러 스크립트 의 파이썬 버전 이 추악하고 길고 비교할 수 없기 때문에 @EvanPlaice에 동의하지 않습니다 . 많은 일을 해야 쉘 스크립트를, 많은 사람들이 안 . 모든 것이 Python 또는 BASH (또는 다른 것) 중 하나 일 필요는 없습니다.
(a | b; c ) | something >result
subprocess
shell=True
예, 물론 :)
쉘 스크립트를 다시 작성하지 않는 데 도움이되는이 라이브러리를 살펴보십시오 (Plumbum의 좌우명).
당신이 AWK 교체 할 경우에도, 나오지도 뭔가 파이썬 그렙은 내가 추천을 기반으로 PYP을 -
"Pyed Piper"또는 pyp는 awk 또는 sed와 유사한 Linux 명령 행 텍스트 조작 도구이지만 표준 python 문자열 및 목록 방법과 강력한 사용자 정의 기능을 사용하여 강력한 프로덕션 환경에서 빠른 결과를 생성합니다.
방금 bash와 ipython의 가장 좋은 부분을 결합하는 방법을 발견했습니다. 지금까지 이것은 하위 프로세스 등을 사용하는 것보다 나에게 더 편안해 보입니다. 기존 bash 스크립트의 큰 부분을 쉽게 복사하고 python 방식으로 오류 처리를 추가 할 수 있습니다. :) 그리고 내 결과는 다음과 같습니다.
#!/usr/bin/env ipython3
# *** How to have the most comfort scripting experience of your life ***
# ######################################################################
#
# … by using ipython for scripting combined with subcommands from bash!
#
# 1. echo "#!/usr/bin/env ipython3" > scriptname.ipy # creates new ipy-file
#
# 2. chmod +x scriptname.ipy # make in executable
#
# 3. starting with line 2, write normal python or do some of
# the ! magic of ipython, so that you can use unix commands
# within python and even assign their output to a variable via
# var = !cmd1 | cmd2 | cmd3 # enjoy ;)
#
# 4. run via ./scriptname.ipy - if it fails with recognizing % and !
# but parses raw python fine, please check again for the .ipy suffix
# ugly example, please go and find more in the wild
files = !ls *.* | grep "y"
for file in files:
!echo $file | grep "p"
# sorry for this nonsense example ;)
filelines = ! cat myfile
$var
쉘 명령에서 와 같이 파이썬 변수를 사용할 수 있습니까? 와. 이것이 정답입니다.
2015 년 및 Python 3.4 릴리스부터는 http://xon.sh/ 또는 https://github.com/scopatz/xonsh 에서 합리적으로 완전한 사용자 대화 형 셸을 사용할 수 있습니다.
데모 비디오 파이프를 사용하고 있지만, 경우에 기본 쉘 모드가 지원됩니다 표시되지 않습니다.
Xonsh ( 'conch')는 bash를 모방하기 위해 매우 열심히 노력하므로 이미 근육 기억을 얻은 것들은 다음과 같습니다.
env | uniq | sort -r | grep PATH
또는
my-web-server 2>&1 | my-log-sorter
여전히 잘 작동합니다.
이 튜토리얼은 꽤 길며 일반적으로 재나 bash 프롬프트에서 기대할 수있는 많은 기능을 다루는 것 같습니다.
?
&??
*.xsh
가져올 수있는 명령 및 / 또는 스크립트를 실행합니다${}
$()
하위 프로세스,을 사용 하여 캡처되지 않은 하위 프로세스 $[]
,@()
*
또는 정규식 파일 이름 글 로빙 및 백틱.xsh
다음 xonsh 코드 파일의 확장자 github.com/xonsh/xonsh/issues/2478을 . 그렇지 않으면 파일 evalx
에서 직접 호출하는 데 사용해야 .py
합니다.
처음에는 sh, sed, awk (그리고 찾기, grep, ...)가있었습니다. 좋았습니다. 그러나 awk는 이상한 작은 짐승이 될 수 있으며 자주 사용하지 않으면 기억하기가 어렵습니다. 그런 다음 큰 낙타가 펄을 만들었습니다. Perl은 시스템 관리자의 꿈이었습니다. 스테로이드의 쉘 스크립팅과 같습니다. 정규 표현식을 포함한 텍스트 처리는 언어의 일부일뿐입니다. 사람들이 펄로 큰 응용 프로그램을 만들려고했습니다. 펄은 응용 프로그램이 될 수 있지만 실제로 조심하지 않으면 혼란스러워 보일 수 있습니다. 그리고이 모든 플랫 데이터 비즈니스가 있습니다. 프로그래머 너트를 운전하는 것으로 충분합니다.
Python, Ruby 등을 입력하십시오. 이것들은 정말 좋은 범용 언어입니다. 그들은 텍스트 처리를 지원하고 잘 수행합니다 (어쩌면 언어의 기본 핵심에 밀접하게 얽혀 있지는 않지만). 그러나 그들은 또한 확장 성이 뛰어나고, 하루가 끝날 때 여전히 멋진 코드를 가지고 있습니다. 그들은 또한 대부분의 것을위한 많은 도서관이있는 꽤 무거운 공동체를 개발했습니다.
이제 Perl에 대한 부정은 대부분 의견의 문제이며, 확실히 어떤 사람들은 매우 깨끗한 Perl을 작성할 수 있지만,이 많은 사람들이 난독 화 된 코드를 작성하기가 너무 쉽다고 불평하면서 진실의 일부가 있다는 것을 알고 있습니다. 문제는 실제로 다음과 같습니다. 간단한 bash 스크립트 대체 이상 으로이 언어를 사용할 것입니까? 그렇지 않다면 더 많은 Perl을 배우십시오. 그것은 절대적으로 환상적입니다. 다른 한편으로, 당신이 더 많은 일을하고자 할 때 당신과 함께 성장할 언어를 원한다면, 파이썬이나 루비를 제안 할 수 있습니다.
어느 쪽이든, 행운을 빌어 요!
멋진 온라인 책 Dive Into Python을 제안합니다 . 내가 원래 언어를 배운 방법입니다.
언어의 기본 구조와 많은 유용한 데이터 구조를 가르치는 것 외에도 파일 처리 에 대한 장과 정규 표현식 등에 대한 장이 있습니다.
이전 답변에 추가 : 대화식 명령 (adduser, passwd 등)을 처리하기 위해 pexpect 모듈을 확인하십시오
내가 파이썬을 좋아하는 한 가지 이유는 POSIX 도구보다 훨씬 표준화되어 있기 때문입니다. 각 비트가 다른 운영 체제와 호환되는지 두 번 및 세 번 확인해야합니다. Linux 시스템에서 작성된 프로그램은 OSX의 BSD 시스템에서 동일하게 작동하지 않을 수 있습니다. Python을 사용하면 대상 시스템에 충분히 최신 버전의 Python이 있는지 확인해야합니다.
더 좋은 점은 표준 Python으로 작성된 프로그램이 Windows에서도 실행될 수 있다는 것입니다!
경험을 바탕으로 의견을 제시하겠습니다.
쉘의 경우 :
파이썬의 경우 :
나는 보통 대부분의 것들에 대해 bash를 선택하지만, 창 경계를 넘어야 할 것이 있으면 파이썬을 사용합니다.
이 주제를 연구하는 동안, 이 개념 증명 코드 ( http://jlebar.com/2010/2/1/Replacing_Bash.html 의 주석을 통해 )를 통해 "파이썬에서 쉘과 같은 파이프 라인을 작성하여 간결한 구문 및 기존 시스템 도구를 활용하는 것이 좋습니다 ":
for line in sh("cat /tmp/junk2") | cut(d=',',f=1) | 'sort' | uniq:
sys.stdout.write(line)
최선의 방법은 문제를 해결하기위한 도구입니다. 텍스트 파일을 처리하는 경우 Sed, Awk 및 Perl이 최고의 경쟁자입니다. 파이썬은 범용 동적 언어입니다. 범용 언어와 마찬가지로 파일 조작을 지원하지만 이것이 핵심 목적이 아닙니다. 특히 동적 언어가 필요한 경우 Python 또는 Ruby를 고려합니다.
간단히 말해서, Sed와 Awk를 정말 잘 배우고, * nix의 맛 (모든 배쉬 내장, grep, tr 등)과 함께 제공되는 다른 모든 장점을 배우십시오. 관심있는 텍스트 파일 처리라면 이미 올바른 것을 사용하고 있습니다.
ShellPy 라이브러리 에서 bash 대신 python을 사용할 수 있습니다 .
다음은 Github에서 Python 사용자의 아바타를 다운로드하는 예입니다.
import json
import os
import tempfile
# get the api answer with curl
answer = `curl https://api.github.com/users/python
# syntactic sugar for checking returncode of executed process for zero
if answer:
answer_json = json.loads(answer.stdout)
avatar_url = answer_json['avatar_url']
destination = os.path.join(tempfile.gettempdir(), 'python.png')
# execute curl once again, this time to get the image
result = `curl {avatar_url} > {destination}
if result:
# if there were no problems show the file
p`ls -l {destination}
else:
print('Failed to download avatar')
print('Avatar downloaded')
else:
print('Failed to access github api')
보다시피, 억음 악센트 (`) 기호 안의 모든 표현식은 쉘에서 실행됩니다. 그리고 파이썬 코드에서이 실행 결과를 캡처하고 이에 대한 작업을 수행 할 수 있습니다. 예를 들면 다음과 같습니다.
log = `git log --pretty=oneline --grep='Create'
이 줄은 먼저 git log --pretty=oneline --grep='Create'
셸에서 실행 된 다음 결과를 로그 변수에 할당합니다. 결과는 다음과 같은 속성을 갖습니다.
stdout 실행 된 프로세스의 stdout 에서 전체 텍스트
실행 된 프로세스의 stderr 에서 전체 텍스트를 stderr
실행의 리턴 코드
이것은 라이브러리에 대한 일반적인 개요이며, 예제가 포함 된 자세한 설명은 여기를 참조하십시오 .
텍스트 파일 조작이 일반적으로 한 번이고 쉘 프롬프트에서 수행되면 파이썬에서 더 나은 것을 얻지 못할 것입니다.
다른 한편으로, 당신이 일반적으로 같은 (또는 유사한) 작업을 반복해서 수행해야하고 그것을하기위한 스크립트를 작성해야한다면, 파이썬은 훌륭합니다-쉽게 자신의 라이브러리를 만들 수 있습니다 (당신은 할 수 있습니다 쉘 스크립트도 있지만 더 성가시다).
느낌을 얻는 아주 간단한 예입니다.
import popen2
stdout_text, stdin_text=popen2.popen2("your-shell-command-here")
for line in stdout_text:
if line.startswith("#"):
pass
else
jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">"))
# do something with jobID
sys 및 getopt 모듈도 확인하십시오. 가장 먼저 필요한 모듈입니다.
PyPI에 패키지를 게시했습니다 : ez . 설치에
사용하십시오 pip install ez
.
쉘에 공통 명령을 압축했으며 멋지게 내 lib는 기본적으로 쉘과 동일한 구문을 사용합니다. 예를 들어, cp (source, destination)는 파일과 폴더를 모두 처리 할 수 있습니다! (shutil.copy의 래퍼 shutil.copytree와 어느 것을 사용할지 결정합니다). 훨씬 더 멋지게 R과 같은 벡터화를 지원할 수 있습니다!
또 다른 예 : os.walk 없음, fls (path, regex)를 사용하여 파일을 재귀 적으로 찾고 정규식으로 필터링하면 전체 경로가 있거나없는 파일 목록을 반환합니다
마지막 예 : 그것들을 결합하여 매우 간단한 스크립트를 작성할 수 있습니다.
files = fls('.','py$'); cp(files, myDir)
확실히 확인하십시오! 작성 / 개선하는 데 수백 시간이 걸렸습니다!