programing

JSON에 적합한 CLI 툴은 무엇입니까?

goodjava 2023. 3. 31. 22:24

JSON에 적합한 CLI 툴은 무엇입니까?

일반적인 문제

받은 로그를 하는 경우가 만, 입니다.스루풋은 그대로입니다.grep,awk,sed,tr,uniq,sort,zcat,tail,head,join , , , , 입니다.split Unix는 Fancier 에는 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 Plugin을 발견한 후 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.io/jq/

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

2014년 업데이트:

@user456584에서 언급:

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

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

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

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

  • 플렉시블 - JSON 데이터 처리를 위한 "swiss-army-knife" 툴은 간단한 프리 프린터 또는 풀 파워 Javascript 명령줄로 사용할 수 있습니다.
  • 파워풀 - underscore.js(및 underscore.string)의 모든 파워와 기능을 제공합니다.
  • SIMPLE - "perl -pe"를 사용하는 것과 유사하게 JS 한 줄 쓰기를 단순화합니다.
  • 연쇄 - 여러 명령 호출을 연쇄하여 데이터 처리 파이프라인을 만들 수 있습니다.
  • MULTI-FORMAT - 입력/출력 포맷을 풍부하게 지원 - 예쁜 인쇄, 엄격한 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로 변환하는 것입니다.다음은 2개의 Perl 모듈(JSON 및 XML:Simple)을 사용하여 Fly-by 변환을 수행합니다.

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>

이 미친 프로젝트 좀 봐이 기능은 명령줄에서 JSON 입력을 필터링하도록 설계되었습니다.편리한 파이프라인에서 사용할 수 있는 명령줄 REST 클라이언트에 대해서도 resty를 체크합니다.

최근에 JSON은 쉽게 할 수 있다는 것을 알게 되었습니다.eval-ed with Python:

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

단, JSON 입력에 늘이 포함되어 있으면 메서드는 실패합니다.

인터랙티브 터미널 툴도 있습니다.fx

fx의 임의의 JSON 및 이를 줄이기 위한 익명 함수에 파이프로 연결합니다.

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

인수를 전달하지 않고 대화형 모드를 시작합니다.

$ curl ... | fx

FXSL 2.x 라이브러리에서를 참조해 주세요.

이 기능을 사용하면 JSon을 매우 쉽게 통합하고 다음과 같이 사용할 수 있습니다.XML.

예를 들어 다음과 같은 XPath 식을 쓸 수 있습니다.

f:json-document($vstrParam)/Students/*[sex = '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>

위의 변환을 XML 문서에 적용하면(무시), 올바른 결과가 생성됩니다.

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

다행히 XML 분야에서는 XPath, XQuery 및 XSLT와 같은 뛰어난 기술을 이용할 수 있습니다.
[...]
JSON에 이와 같은 툴이 있습니까?

생각엔, 시델이 바로 네가 찾고 있는 거야.

Xidel은 CSS, XPath 3.0, XQuery 3.0, JSONiq 또는 패턴 템플릿을 사용하여 HTML/XML 페이지 또는 JSON-API에서 데이터를 다운로드하고 추출하는 명령줄 도구입니다.또한 새로운 XML/HTML/JSON 문서를 작성할 수도 있습니다.

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

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