파이프를 통해 외부에서 들어오는 입력을, bash script내부에서 어떻게 다룰 수 있나요?

익명 사용자의 이미지

cat text | sed 's/pat/rep/g'

이런 형태가 아니라. bash script를 작성한다고 했을때(예제를 위해 작성한 경우라 효율적이지는 않습니다.)

#!/bin/sh
## substitution.sh 내부입니다.
 
sed 's/pat/rep/g' #이 부분에서 파이프를 통해 들어오는 입력 처리는?

다시한번 말씀드리지만, 좋은 예시는 아닙니다. 다만 bash script내부에서 파이프를 통해 외부로부터 들어오는 입력을 어떻게 핸들링 할 수 있는지가 궁금합니다.

위 경우 다음처럼 사용하고 싶습니다.

cat txt | substitution.sh
.의 이미지

bash script가 아니라 sed script를 배워야겠지요.

$ cat test.txt
tiger tiger tiger

$ cat test.sed
#!/bin/sed -f
s/tiger/lion/g

$ chmod +x test.sed

$ cat test.txt | ./test.sed
lion lion lion
.의 이미지

꼭 bash를 써야 겠다면 아래와 같이 스크립트를 작성합니다. 답변을 얻었으면 답글을 다는 것이 예의일텐테, 가타부타 말이 없어요.

$ cat test.txt
tiger tiger tiger
tiger tiger tiger

$ cat test.sh
#!/bin/bash
while read i; do
   echo "$i" | sed 's/tiger/lion/g'
done

$ cat test.txt | sh test.sh
lion lion lion
lion lion lion
작성자의 이미지

아 답글 감사합니다.

내 제 질문은 grep, awk, sed 등 많은 프로그램들이 파이프를 통해 들어오는 데이터를 처리하는데, 과연 일반 스크립트는 그런 걸 어떻게 처리할 수 있을 까였습니다.

뭐 그렇다고 제가 grep, awk, sed의 소스코드를 분석할 실력이 되는 것도 아니고요.

좀 찾아보니 이런것도 있군요.

cat /dev/stdin | sed 's/tiger/lion/g'

cat /dev/stdin으로 처리할 수 있다는 처음 알게되었습니다.

익명 사용자의 이미지

오 세상에... cat /dev/stdin | sed 's/tiger/lion/g'라니... -_-;;;;

그냥 sed 's/tiger/lion/g' 하면 됩니다.

파이프의 기본 전제는 각 프로그램들이 표준 입력(stdin)을 읽고 처리해서 표준 출력(stdout)에 쓴다는 것입니다. grep, awk, sed 모두 (다르게 설정하지 않으면) 원래 그렇게 동작합니다. 소위 Standard streams이라고 불리는, Unix와 기원을 같이 하는 유서깊은 인터페이스입니다.

https://en.wikipedia.org/wiki/Standard_streams

a | b와 같이 연결하면 shell에 의해 a의 표준 출력이 b의 표준 입력에 연결될 뿐입니다. a와 b는 그저 하던 대로 표준 입력을 읽고 표준 출력에 쓸 뿐, 파이프에 따로 읽거나 쓰기 위한 다른 인터페이스가 있지는 않습니다.

cat txt | substitution.sh와 같이 실행했으면, 이미 substitution.sh의 표준 입력이 cat txt의 표준 출력과 연결된 상태입니다. substitution.sh가 그 입력을 sed에 그대로 넘겨 주고 싶으면, 그냥 그대로 실행하면 되는 겁니다.

cat 남용에 대해서도 하고 싶은 말이 있지만, 링크로 갈음합니다: Useless Use of Cat!

http://porkmail.org/era/unix/award.html#uucaletter

작성자의 이미지

헉. 사실 오늘 cat txt | ./substitution.sh 로 여러번 테스트를 한다고 했었거든요.

그런데, 안돼서 뭔가 특수 변수가 되었건 내부에서 input를 특정해줘야 한다고 생각해서 질문 했던거였는데,

다시 새로 코드 짜서 하니 되네요..... 민망합니다.

여튼 감사합니다.

작성자의 이미지

아니 근데 무슨 10:16분에 답을 달고, 그것도 bash script에서 파이프를 어떻게 처리하는지가 궁금했었던 거고, sed는 파이프를 이용하는 프로그램으로서 보여준것 뿐인데, sed프로그램을 배워야 한다니......

10:16분에 답글달고 10:28분까지 그에 대한 반응이 없자, 예의 운운이라니......

그 12분 동안 무한루프돌며 자기 답들에 고마움을 표시하는지를 매 밀리센컨마다 체크하며 기다리셨나.

인터넷에서 질문을 올리면, 답글이 올라왈때까지 대기하고 있다가 답글 올라오면 10분내로 고맙다고 하는게 예의? 언제부터?

그대는 그리 살아오셨나? 모든 고마움의 표시는 10분내로, 그렇게 못하면 몰염치가 당연하듯이?

내가 한국시간으로 오전 1:00시에 "아 답글 감사합니다."라고 올렸는데, 지금 약 6시간 정도 흐른 것 같은데, 뭐 그렇다고 "아니 뭐 이런것 가지고 고맙다니요. 별말씀을 다..."라고 반응하지 않는다고 해서, 난 당신을 예의 없다고 생각하지는 않아요.

특히 while dead로 입력을 받아들이는 부분, "참 괜찮다, 나도 저렇게 생각해 낼 수 있을까"라고 생각했습니다.

감사합니다.

ㄱㄱㅅ의 이미지

남 얘기 말고 너나 잘 해.6

익명 사용자의 이미지

넌 또 뭐냐 병god아

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.