aix 에서 검색및 출력 방법 문의 합니다.

genesin의 이미지

AIX에서 jeus account.xml 에 (아래 예시문)
user별 name|password|group 순으로 검색 및 출력 하는 방법 문의 드립니다.

요청 결과

1. 계정 정보 출력 방법
1번 라인 -> was|was1234!|Administrators
2번 라인 -> oper|oepr1234!|opergroup
3번 라인 -> test|test1234!|testgroup
4번 라인 -> dev|dev1234!|

and

2. 한개씩 검색 방법
was|was1234!|Administrators
.
.
dev|dev1234!|

* dev 계정은 그룹 없습니다.

문의 드립니다.

구글링 하다 KLDP 고수님들 도움이 필요해 가입 후 문의 드립니다.

감사합니다

- 아래 -

<accounts>
    <users>
	<user>
            <description>No description</description>
            <name>was</name>
            <password>was1234!</password>
            <group>Administrators</group>
        </user>
        <user>
            <description>No description</description>
            <name>oper</name>
            <password>oper1234!</password>
  	<group>opergroup</group>
        </user>
        <user>
            <description>No description</description>
            <name>test</name>
            <password>test1234!</password>
			<group>testgroup</group>
        </user>
        <user>
            <description>No description</description>
            <name>dev</name>
            <password>dev1234!</password>
        </user>
    </users>
    <groups>
        <group>
            <description>A group for administrators</description>
            <name>Administrators</name>
        </group>
        <group>
            <description>A group for administrators</description>
            <name>testgorup</name>
        </group>
        <group>
            <description>A group for administrators</description>
            <name>opergroup</name>
        </group>
    </groups>
</accounts>

익명 사용자의 이미지

xml 파일이라 xml 파서 이용하여 구현하면 쉽겠네요. 근데 그 파일에 사용자 수가 대략 얼마나 되나요?
사용자 수가 적으면 대충 찾기하면 되는데, 사용자 수가 10000000 이렇게 많으면 파일 크기가 크니까.. 파일 크기 감안한 알고리즘이 필요하거든요. 뭐 알고리즘이라 할 것도 없지만.

genesin의 이미지

사용자는 10명내 입니다.
인프라 점검 용 으로 활용 하려 합니다.
감사합니다.

익명 사용자의 이미지

할줄 아는게 루비밖에 없어서 루비로 대충 짜봤습니다.

#!/usr/bin/ruby
 
require 'rexml/document'
 
file = File.new "sample.xml"
doc  = REXML::Document.new file
doc.elements.each("users/user") do |element|
  name     = element.elements["name"].text
  password = element.elements["password"].text
  group    = if element.elements["group"]
               element.elements["group"].text
             end
 
  result = [name, password].join("|")
 
  if (group)
    result << "|" << group
  end
 
  puts result
end
 
file.close

[hodong@hodong-pc ~]$ ruby sample.rb 
was|was1234!|Administrators
oper|oper1234!|opergroup
test|test1234!|testgroup
dev|dev1234!

검색은 이렇게 하면 됩니다.

[hodong@hodong-pc ~]$ ruby sample.rb | grep dev
dev|dev1234!
genesin의 이미지

익명 사용자님 빠른 답글 대단히 감사합니다!!

업무환경에 ruby 가 미설치 및 설치가 불가 하여 ㅠ_ㅠ

AIX 환경에서 OS 명령어 활용하여 결과 출력 하기 힘드네요...

익명 사용자의 이미지

xml 에 버그 있어요. account accounts
루비코드가 아래처럼 수정되어야 함.
"accoutns/users/user"
저는 할줄 아는게 루비밖에 없으니 sh 고수님께서 설명해주시겠죠

genesin의 이미지

ㅎㅎ 오타 죄송 합니다.

익명 사용자의 이미지

가만보니 문자 검색/추출 수요가 많은거 같아요.
인생 말년에 폐지 줍기 방지 차원에서 나중에 시간날 때 유/무료 어플 만들어서 배포해볼까요.

genesin의 이미지

저도 폐지 줍기 방지 해야 하는데요 ㅠㅠ

ymir의 이미지

AIX 에도 xml2 패키지 같은게 있나 모르겠네요.
xml 파일을 파싱해서 flat 하게 뽑아주는 명령인데, 꽤 쓸만하네요.

https://packages.ubuntu.com/source/bionic/xml2

$ sudo apt install xml2
$ cat in.xml
<users>
        <user>
                <description>No description</description>
                <name>was</name>
                <password>was1234!</password>
                <group>Administrators</group>
        </user>
        <user>
                <description>No description</description>
                <name>oper</name>
                <password>oper1234!</password>
                <group>opergroup</group>
        </user>
        <user>
                <description>No description</description>
                <name>test</name>
                <password>test1234!</password>
                <group>testgroup</group>
        </user>
        <user>
                <description>No description</description>
                <name>dev</name>
                <password>dev1234!</password>
        </user>
</users>
 
$ cat x.sh
#!/bin/bash
 
# $1 - xml file to display
# $2 - (optional) user id to find
 
if [ ! -f "$1" ] ; then
	echo "Error: xml file not found .."
	exit 1
fi
 
if [ -n "$2" ]; then
	eval $(xml2 < $1 | grep -A 2 -B 1 "/name=$2" | sed 's|/users/user/||g' | sed 's/=\(.*\)$/="\1"/g')
	[ -n "$name" ] && echo "$name|$password|$group|$description" || echo "not found .."
else
	xml2 < $1 | sed 's/=\(.*\)$/="\1"/g' | sed -z 's/\n\([a-z/]\+\)=/;\1=/g' | sed 's|/users/user[;/]||g' | \
	while read -r line; do
		unset name password group description
		eval $line
		[ -n "$name" ] && echo "$name|$password|$group|$description"
	done
fi
 
exit 0
 
 
$ bash x.sh in.xml
was|was1234!|Administrators|No description
oper|oper1234!|opergroup|No description
test|test1234!|testgroup|No description
dev|dev1234!||No description
$ bash x.sh in.xml was
was|was1234!|Administrators|No description
$ bash x.sh in.xml nouser
not found ..
$ bash x.sh in.xml | grep '^test|'
test|test1234!|testgroup|No description

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ymir의 이미지

$ cat in.xml | sed -z 's|>[^<]*<\([a-z]\+\)|/\1|g' | sed 's|<[a-z/]\+>|,|g' | \
> while IFS=, read -r empty desc id pw grp; do [ -n "$id" ] && echo "$id|$pw|$grp|$desc"; done
was|was1234!|Administrators|No description
oper|oper1234!|opergroup|No description
test|test1234!|testgroup|No description
dev|dev1234!||No description

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

genesin의 이미지

ymlr 고수님께서 알려 주신 스크립트와 명령어 확인 해보겠습니다.
감사합니다!!!

genesin의 이미지

AIX는 왜케 명령어들이 옵션 없을가요 ㅠㅠ

ymir의 이미지

1. -z 는 GNU sed 에서만 제공하는 옵션인가 보네요.
AIX 라도 GNU sed 설치할 수 있지 않을까요?

2. -z 는 newline 을 NUL 문자로 바꿔주는 옵션으로, multi line 패턴을 만들 때 씁니다.
그렇다면 다음처럼 해도 될 것 같구요.

$ cat in.xml | tr '\n' '\0' | sed 's|>[^<]*<\([a-z]\+\)|/\1|g' | tr '\0' '\n' | sed 's|<[a-z/]\+>|,|g' | \
> while IFS=, read -r empty desc id pw grp; do [ -n "$id" ] && echo "$id|$pw|$grp|$desc"; done
was|was1234!|Administrators|No description
oper|oper1234!|opergroup|No description
test|test1234!|testgroup|No description
dev|dev1234!||No description

3. newline 이 들어간 라인을 처리하는 전통적인(?) 방법은.. 다음과 같습니다.

$ cat in.xml | sed ':a;N;$!ba;s|>[^<]*<\([a-z]\+\)|/\1|g' | sed 's|<[a-z/]\+>|,|g' | \
> while IFS=, read -r empty desc id pw grp; do [ -n "$id" ] && echo "$id|$pw|$grp|$desc"; done
was|was1234!|Administrators|No description
oper|oper1234!|opergroup|No description
test|test1234!|testgroup|No description
dev|dev1234!||No description
  • :a - create a label 'a'
  • N - append the next line to the pattern space
  • $! - if not the last line, ba branch (go to) label 'a'

참고: https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.