Python과 Bash를 결합하는 방법

6688 단어 pythonbash결합
Linux 사용자에게 명령줄 조작은 이미 매우 익숙하다.다른 유행하는 운영체제와 달리 Linux 커뮤니티에서 명령줄을 사용하는 것은 그래픽 사용자 인터페이스를 사용하여 유사한 작업을 수행하는 것보다 명령줄이 더 우아하고 효과적인 해결 방안을 제공할 수 있다.
Linux 커뮤니티의 명령행에 대한 의존이 끊임없이 증가함에 따라 UNIX 셸(예를 들어 bash와 zsh)은 이미 매우 강력한 도구로 발전하여 UNIX 셸의 경험을 보충할 수 있다.bash와 다른 유사한 셸을 사용하면 파이프, 파일 이름 어댑터, 스크립트라는 파일에서 명령을 읽는 등 많은 강력한 기능을 사용할 수 있습니다.
명령줄의 기능을 보여 주는 실제 예시를 봅시다.사용자가 서비스에 로그인할 때마다 사용자 이름은 텍스트 파일에 기록됩니다.이 예시에 대해 우리는 얼마나 많은 유일한 사용자가 이 서비스를 사용하는지 찾아낼 것이다.
다음 예제의 일련의 명령은 비교적 작은 구축 블록을 연결함으로써 더욱 복잡한 유틸리티의 기능을 보여 준다.

$ cat names.log | sort | uniq | wc -l
$ cat names . log | sort | uniq | wc - l
파이핑 기호 (|) 는 명령의 표준 출력을 다음 명령으로 전달하는 표준 입력에 사용됩니다.이 예에서catnames.txt의 출력은sort 명령에 전달됩니다.sort 명령의 출력은 알파벳순으로 파일의 줄을 다시 배열합니다.다음에 유닉스 명령에 전달합니다. 이 명령은 모든 중복된 이름을 삭제합니다.마지막으로, uniq의 출력은 wc 명령으로 전달됩니다.wc는 계수 명령이며, 줄 수를 되돌려주는 -l 로고를 설정합니다.이렇게 하면 많은 명령을 연결할 수 있습니다.
그러나 때로는 필요한 내용이 복잡해지고 명령을 연결시키는 것이 서투르게 될 수도 있다.이런 상황에서 셸 스크립트가 답이다.셸 스크립트는 셸이 읽고 순서대로 실행하는 명령 목록입니다.셸 스크립트는 변수, 흐름 제어, 데이터 구조 등 일부 프로그래밍 언어의 기초 지식도 지원한다.Shell 스크립트는 반복적으로 실행되는 일괄 처리 작업에 유용합니다.불행하게도 셸 스크립트는 다음과 같은 단점이 있습니다.
셸 스크립트는 너무 복잡해지기 쉬우며, 그것들을 개선하거나 유지하려는 개발자에게는 읽을 수 없다.
이 셸 스크립트의 문법과 해석기는 통상적으로 매우 서투르고 직관적이지 않다.문법이 서투를수록 이 스크립트를 사용해야 하는 개발자에게는 가독성이 떨어진다.
이 코드는 보통 다른 스크립트에서 사용할 수 없습니다.스크립트 간의 코드 재사용은 왕왕 매우 어렵고, 스크립트는 왕왕 특정한 문제에 의해 결정된다.
고급 기능(예를 들어 HTML 해석 또는 HTTP 요청)에 사용되는 라이브러리는 현대 프로그래밍과 스크립트 언어처럼 쉽게 구할 수 없습니다.
이런 문제들은 셸 스크립트를 처리하기 어렵고 대량의 개발자들의 시간 낭비를 초래할 수 있다.대신 파이썬 프로그래밍 언어는 매우 강력한 대체품으로 사용할 수 있다.Shell 스크립트 대신 Python을 사용하면 다음과 같은 이점이 많습니다.
기본적으로 모든 주요 Linux 릴리스에는 Python이 설치되어 있습니다.명령줄을 열고 바로python을 입력하면 Python 해석기에 들어갈 수 있습니다.이러한 보편성은 그것으로 하여금 대부분의 스크립트 임무의 현명한 선택이 되게 한다.
Python은 읽기 쉽고 이해하기 쉬운 문법을 가지고 있습니다.그것의 스타일은 간단명료하고 간결한 코드를 강조하며, 개발자가 셸 스크립트에 적합한 표준 시스템 스타일로 작성할 수 있도록 허용한다.
Python은 해석형 언어로서 컴파일 단계가 없다는 것을 의미한다.이것은 Python을 스크립트를 작성하는 데 이상적인 언어로 만들었으며, 설명 방식으로 새 코드를 빠르게 시도할 수 있도록 합니다.이것은 개발자로 하여금 전체 프로그램을 파일에 쓸 필요가 없이 신속하게 수정할 수 있게 한다.
Python은 모든 기능을 갖춘 프로그래밍 언어입니다.코드 재사용은 매우 간단합니다. 왜냐하면 Python 모듈은 쉽게 가져와 모든 Python 스크립트에서 사용할 수 있기 때문입니다.스크립트는 쉽게 확장하거나 구축할 수 있다.
Python은 뛰어난 표준 라이브러리와 수천 개의 제3자 라이브러리를 사용하여 각종 고급 실용 프로그램, 예를 들어 해상도와 요청 라이브러리를 처리할 수 있다.예를 들어 Python의 표준 라이브러리는 날짜 시간 라이브러리를 포함하고 있으며, 이 라이브러리는 날짜를 지정한 모든 형식으로 해석하여 다른 날짜와 쉽게 비교할 수 있습니다.
그러나 Python은 모든 bash 명령을 바꿀 수 없습니다.UNIX 방식으로 실행되는 Python 프로그램 (표준 입력을 읽고 표준 출력을 쓰는 것) 을 작성하는 것은 기존의 셸 명령 (예:cat와sort) 을 위한 Python 대체품을 작성하는 것과 같이 강력합니다.
우리 본문 앞에서 이미 해결한 문제를 기초로 합시다.이미 완성된 작업 외에 어떤 사용자가 시스템에 로그인한 횟수를 찾아내자.uniq 명령은 중복 항목만 삭제하지만 몇 개의 중복 항목에 대한 정보는 제공하지 않습니다.uniq 대신 Python 스크립트는 체인의 다른 명령으로 사용할 수 있습니다.이것은 이 작업을 수행하는 Python 프로그램입니다. (예에서 이 파일을namescount.py라고 부릅니다.)

#!/usr/bin/env python
import sys

if __name__ == "__main__":
  # Initialize a names dictionary as empty to start with.
  # Each key in this dictionary will be a name and the value
  # will be the number of times that name appears.
  names = {}
  # sys.stdin is a file object. All the same functions that
  # can be applied to a file object can be applied to sys.stdin.
  for name in sys.stdin.readlines():
      # Each line will have a newline on the end
      # that should be removed.
      name = name.strip()
      if name in names:
          names[name] += 1
      else:
          names[name] = 1

  # Iterating over the dictionary,
  # print name followed by a space followed by the
  # number of times it appeared.
  for name, count in names.iteritems():
      sys.stdout.write("%d\t%s
" % (count, name)) #!/usr/bin/env python import sys if __name__ == "__main__" :      # Initialize a names dictionary as empty to start with.      # Each key in this dictionary will be a name and the value      # will be the number of times that name appears.      names = { }      # sys.stdin is a file object. All the same functions that      # can be applied to a file object can be applied to sys.stdin.      for name in sys . stdin . readlines ( ) :              # Each line will have a newline on the end              # that should be removed.              name = name . strip ( )              if name in names :                      names [ name ] += 1              else :                      names [ name ] = 1      # Iterating over the dictionary,      # print name followed by a space followed by the      # number of times it appeared.      for name , count in names . iteritems ( ) :              sys . stdout . write ( "%d\t%s
" % ( count , name ) )
이 Python 스크립트가 명령 체인에 어떻게 적합한지 봅시다.우선,sys를 통해stdin 대상이 공개한 표준 입력에서 입력을 읽습니다.모든 출력은sys에 기록됩니다.stdout 대상, 이것은 Python에서 표준 출력을 실현하는 방식입니다.Python 사전(다른 언어에서는 일반적으로 해시 맵이라고 함)은 사용자 이름에서 중복 계수까지의 맵을 가져오는 데 사용됩니다.모든 사용자의 수를 얻으려면 다음과 같이 하십시오.

$ cat names.log | python namescount.py
$ cat names . log | python namescount . py
사용자가 나타나는 횟수와 사용자 이름의 수를 표시합니다.다음으로 해야 할 일은 이 시스템을 가장 자주 사용하는 사용자를 순서대로 표시하는 것이다.이것은 파이썬 단계에서 완성할 수 있지만, 핵심 유닉스 유틸리티가 이미 제공한 유틸리티를 사용해서 그것을 실현합시다.이전에, 나는sort 명령을 사용하여 자모를 정렬했다.명령이 -rn 로고를 제공하면, 줄에 따라 숫자를 정렬합니다.Python 스크립트가 표준에 따라 출력됨에 따라 명령을 파이프를 통해sort로 전달하고 필요한 출력을 검색하기만 하면 됩니다.

$ cat names.log | python namescount.py | sort -rn
$ cat names . log | python namescount . py | sort - rn
이것은 Python을 명령 체인의 일부로 사용하는 강력한 예입니다.이 경우 Python의 장점은 다음과 같습니다.
  • 캣과sort 등 도구와 연결하는 능력.간단한 유틸리티(파일을 한 줄씩 읽고 숫자로 정렬하는 것)는 검증된 UNIX 명령으로 처리됩니다.이 명령들도 한 줄씩 읽습니다. 이것은 이 기능들이 대형 파일로 축소될 수 있고 속도가 매우 빠르다는 것을 의미합니다
  • 체인에서 복잡한 작업을 해야 할 때 매우 뚜렷하고 간결한Python 스크립트를 작성할 수 있습니다. 이 스크립트는 필요한 작업을 수행하고 체인의 다음 링크로 책임을 옮길 것입니다
  • 이 예는 이름에 대한 것이지만 이 입력에 중복된 줄의 입력을 포함하면 줄마다 중복된 수량을 출력합니다.Python 코드를 모듈화하여 다양한 장면에 적용할 수 있습니다
  • 모듈화와 파이프 방식으로 파이썬 스크립트를 조합하는 강력한 기능을 보여주기 위해 문제를 더욱 확대합시다.이 서비스의 다섯 번째 사용자를 찾겠습니다.head는 주어진 표준 입력을 표시하기 위해 일정한 줄을 지정할 수 있는 명령입니다.명령줄에 추가하면 다음과 같습니다.
    
    $ cat names.log | python namescount.py | sort -rn | head -n 5
    $ cat names . log | python namescount . py | sort - rn | head - n 5
    이것은 처음 다섯 명의 사용자만 표시하고 나머지 사용자는 무시합니다.마찬가지로 다섯 명의 사용자가 이 서비스를 최소한으로 사용하려면tail 명령을 사용할 수 있으며, 이 명령은 같은 매개 변수를 사용할 수 있다.Python 명령을 표준 출력에 인쇄한 결과 기능을 구축하고 확장할 수 있습니다.
    이상은 간단한 소개입니다. 실제적으로 여러분이 유연하게 활용하시면 됩니다.
    이상은Python과Bash가 결합하는 방법에 대한 상세한 내용입니다.python과bash의 결합에 관한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

    좋은 웹페이지 즐겨찾기