IT Share you

JSON을위한 좋은 CLI 도구는 무엇입니까?

shareyou 2020. 12. 12. 12:42
반응형

JSON을위한 좋은 CLI 도구는 무엇입니까?


일반적인 문제

나는, 이벤트의 근본 원인을 진단은 영향을 얼마나 많은 사용자를 결정하거나, 성능과 최근의 코드 변경의 처리량에 미치는 영향을 평가하기 위해 타이밍 로그를 증류 할 수 있지만, 내 도구는 동일하게 유지 : grep, awk, sed, tr, uniq, sort, zcat, tail, head, join,와 split. 그것들을 모두 함께 붙이기 위해 Unix는 우리에게 파이프를 제공하고 더 멋진 필터링을 위해 우리는 xargs. 이것이 실패하면 항상 perl -e.

이러한 도구는 CSV 파일, 탭으로 구분 된 파일, 예측 가능한 라인 형식의 로그 파일 또는 쉼표로 구분 된 키-값 쌍이있는 파일을 처리하는 데 적합합니다. 즉, 각 줄에 컨텍스트가없는 파일입니다.

XML 아날로그

나는 최근에 사용자의 사용 히스토그램을 작성하기 위해 기가 바이트의 XML을 탐색해야했습니다. 내가 가지고있는 도구로는 충분히 쉬웠지만 더 복잡한 쿼리의 경우 일반적인 접근 방식이 무너졌습니다. 다음과 같은 항목이있는 파일이 있다고 가정합니다.

<foo user="me">
    <baz key="zoidberg" value="squid" />
    <baz key="leela"    value="cyclops" />
    <baz key="fry"      value="rube" />
</foo>

그리고 사용자에서 <baz>s 당 평균 수에 대한 매핑을 생성한다고 가정 해 보겠습니다 <foo>. 한 줄씩 처리하는 것은 더 이상 옵션이 아닙니다. <foo>현재 검사중인 사용자를 알아야 누구의 평균을 업데이트해야하는지 알 수 있습니다. 이 작업을 수행하는 모든 종류의 Unix one liner는 이해할 수 없을 것입니다.

다행스럽게도 XML 영역에는 XPath, XQuery 및 XSLT와 같은 훌륭한 기술이 있습니다.

이전에는 XML::XPath위와 같은 쿼리를 수행하기 위해 멋진 Perl 모듈 을 사용하는 데 익숙해 졌지만 현재 창에 대해 XPath 표현식을 실행할 수 있는 TextMate 플러그인을 찾은 후 XML 쿼리를위한 일회용 Perl 스크립트 작성을 중단했습니다. 그리고 나는 이것을 입력 할 때 설치되는 XMLStarlet 에 대해 방금 알게되었고 앞으로 사용하기를 기대합니다.

JSON 솔루션?

그래서 이것은 내 질문으로 이어집니다 : JSON에 대해 이와 같은 도구가 있습니까? 일부 조사 작업에서 JSON 파일에 대해 유사한 쿼리를 수행해야하는 것은 시간 문제 일 뿐이며 XPath 및 XSLT와 같은 도구가 없으면 이러한 작업이 훨씬 더 어려워집니다. 다음과 같은 JSON이있는 경우 :

{
  "firstName": "Bender",
  "lastName": "Robot",
  "age": 200,
  "address": {
    "streetAddress": "123",
    "city": "New York",
    "state": "NY",
    "postalCode": "1729"
  },
  "phoneNumber": [
    { "type": "home", "number": "666 555-1234" },
    { "type": "fax", "number": "666 555-4567" }
  ]
}

그리고 각 사람이 가지고있는 평균 전화 번호 수를 찾으려면 XPath로 다음과 같이 할 수 있습니다.

fn:avg(/fn:count(phoneNumber))

질문

  1. 이런 방식으로 JSON 파일을 "쿼리"할 수있는 명령 줄 도구가 있습니까?
  2. Unix 명령 줄에서 여러 JSON 파일을 처리해야하는 경우 어떤 도구를 사용합니까?
  3. 젠장, JSON에 대해 이와 같은 쿼리 언어를 만드는 작업도 있습니까?
  4. 일상적인 작업에서 이와 같은 도구를 사용하는 경우 그 도구에 대해 무엇을 좋아하거나 싫어합니까? 문제가 있습니까?

점점 더 많은 데이터 직렬화가 JSON을 사용하여 수행되고 있다는 것을 알고 있으므로 향후 대용량 데이터 덤프를 분석 할 때 이와 같은 처리 도구가 중요 할 것입니다. JSON 용 언어 라이브러리는 매우 강력하고 이러한 종류의 처리를 수행하는 스크립트를 작성하는 것은 쉽지만 사람들이 데이터 셸 도구를 실제로 사용할 수 있도록하려면 필요합니다.

관련 질문


방금 찾았습니다.

http://stedolan.github.com/jq/

"jq는 가볍고 유연한 명령 줄 JSON 프로세서입니다."

2014 년 업데이트 :

@ user456584가 언급했습니다.

'json'명령 (예 : 'jsontool')도 있습니다. 나는 jq보다 그것을 선호하는 경향이 있습니다. 매우 UNIX-y. 다음은 프로젝트 링크입니다. github.com/trentm/json –

http://github.com/trentm/jsonjsonREADME 에는 유사한 항목의 긴 목록이 있습니다.


명령 줄 JSON 조작을 위해 특별히 설계된 모듈을 만들었습니다.

https://github.com/ddopson/underscore-cli

  • 유연성-JSON 데이터 처리를위한 "swiss-army-knife"도구-간단한 프리티 프린터 또는 완전한 Javascript 명령 줄로 사용할 수 있습니다.
  • POWERFUL -underscore.js (underscore.string 포함)의 모든 기능과 기능을 노출합니다.
  • SIMPLE은 - "펄 -pe"를 사용하여 유사한 JS 하나 라이너 쓸 간단 만든다
  • CHAINED- 여러 명령 호출을 함께 연결하여 데이터 처리 파이프 라인을 만들 수 있습니다.
  • 다중 형식 -입력 / 출력 형식에 대한 풍부한 지원-예쁜 인쇄, 엄격한 JSON 등 [출시 예정]
  • 문서화 -모든 명령에 대한 여러 예제가 포함 된 우수한 명령 줄 문서

강력한 일을 정말 쉽게 할 수 있습니다.

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

매우 멋진 명령 줄 도움말 시스템이 있으며 매우 유연합니다. 잘 테스트되고 사용할 준비가되었습니다. 그러나 나는 여전히 입력 / 출력 형식의 대안과 같은 몇 가지 기능을 구축하고 있으며 템플릿 처리 도구에서 병합하고 있습니다 (TODO.md 참조). 기능 요청이있는 경우이 게시물에 댓글을 달거나 github에 문제를 추가하세요. 상당히 광범위한 기능 세트를 설계했지만 커뮤니티 구성원이 필요로하는 기능의 우선 순위를 정하게되어 기쁩니다.


할 수있는 한 가지 방법은 XML로 변환하는 것입니다. 다음은 두 개의 perl 모듈 (JSON 및 XML :: Simple)을 사용하여 플라이 바이 변환을 수행합니다.

cat test.json | perl -MJSON -MXML::Simple -e 'print XMLout(decode_json(do{local$/;<>}),RootName=>"json")'

예를 들어 json은 다음과 같이 끝납니다.

<json age="200" firstName="Bender" lastName="Robot">
  <address city="New York" postalCode="1729" state="NY" streetAddress="123" />
  <phoneNumber number="666 555-1234" type="home" />
  <phoneNumber number="666 555-4567" type="fax" />
</json>

이 미친 프로젝트 jsawk를 살펴보십시오 . 명령 줄에서 JSON 입력을 통해 필터링하도록 설계되었습니다. 유용 할 수있는 파이프 라인에서 사용할 수있는 명령 줄 REST 클라이언트에 대해서도 resty확인하십시오 .


최근에 저는 JSON eval이 Python으로 쉽게 -ed 될 수 있다는 것을 발견했습니다 .

$ python -c "json=eval(open('/json.txt').read()); print len(json['phoneNumber'])"
2

JSON 입력에 null이 포함되어 있으면 메서드가 분명히 실패합니다.


FXSL 2.x 라이브러리f:json-document() 에서를 살펴보십시오 .

이 함수를 사용하면 JSon을 통합하고 XML처럼 사용하기가 매우 쉽습니다.

예를 들어 다음 XPath 표현식을 작성할 수 있습니다.

f:json-document($vstrParam)/Students/*[sex = 'Female']

그리고 모든 아이들이 수 Studentssex = 'Female'

다음은 완전한 예입니다.

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:f="http://fxsl.sf.net/"
 exclude-result-prefixes="f xs"
 >
 <xsl:import href="../f/func-json-document.xsl"/>

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vstrParam" as="xs:string">
{

  "teacher":{
    "name":
      "Mr Borat",
    "age":
      "35",
    "Nationality":
      "Kazakhstan"
             },


  "Class":{
    "Semester":
      "Summer",
    "Room":
      null,
    "Subject":
      "Politics",
    "Notes":
      "We're happy, you happy?"
           },

  "Students":
    {
      "Smith":
        {"First Name":"Mary","sex":"Female"},
      "Brown":
        {"First Name":"John","sex":"Male"},
      "Jackson":
        {"First Name":"Jackie","sex":"Female"}
    }
    ,


  "Grades":

    {
      "Test":
      [
        {"grade":"A","points":68,"grade":"B","points":25,"grade":"C","points":15},

        {"grade":"C","points":2, "grade":"B","points":29, "grade":"A","points":55},

        {"grade":"C","points":2, "grade":"A","points":72, "grade":"A","points":65}
       ]
    }


}
 </xsl:variable>

 <xsl:template match="/">
    <xsl:sequence select=
     "f:json-document($vstrParam)/Students/*[sex = 'Female']"/>

 </xsl:template>
</xsl:stylesheet>

When the above transformation is applied on any XML document (ignored), the correct result is produced:

<Smith>
   <First_Name>Mary</First_Name>
   <sex>Female</sex>
</Smith>
<Jackson>
   <First_Name>Jackie</First_Name>
   <sex>Female</sex>
</Jackson>

Fortunately in XML-land, we have wonderful technologies like XPath, XQuery, and XSLT to help us.
[...]
So this leads me to my question: are there any tools like this for JSON?

If you ask me, Xidel is exactly what you're looking for.

Xidel is a command line tool to download and extract data from HTML/XML pages or JSON-APIs, using CSS, XPath 3.0, XQuery 3.0, JSONiq or pattern templates. It can also create new or transformed XML/HTML/JSON documents.

Query:

xidel -s "input.json" \
-e '
  $json/avg(
    count(
      (phoneNumber)()
    )
  )
'

or

xidel -s "input.json" -e '$json/avg(count((phoneNumber)()))'

Output:

2

There is also interactive terminal tool — fx

Pipe into fx any JSON and anonymous function for reducing it.

$ echo '{...}' | fx [code ...]

Start interactive mode without passing any arguments:

$ curl ... | fx

참고URL : https://stackoverflow.com/questions/2933126/what-are-good-cli-tools-for-json

반응형