Pipe and Shell Scripts
Computer Science/OpenSource+Git

Pipe and Shell Scripts

# Pipe

: 이는 앞에있는 cmd의 standard output를 뒤의 standard input으로 이어주는 역할을 하는 command이다.

: 각각의 프로그램은 redirection과 pipe의 존재에 대해 아예 모른다.

-> 명령어들을 조합해서 새로운 명령을 실행한다.

각각 파일을 생성하지 않아도 바로바로 INPUT과 OUTPUT을 전달하고 전달 받을수 있다.

 

#Filter

: data들을 standard input으로 부터 얻은 command들은 이를 변형하여 command output으로 결과를 내보낸다.

: standard input과 standard output를 동시에 사용하는 커맨드들이 있다.

EX) cat, cut, awk, grep, wc, sort, bc, haed

 

- standard output만 사용하는 command들이 있다. : date, du, df, ls, ps, pwd, who

- standard input과 output둘다 사용하지 않는 command가 있다.

 : mkdir, rmdir, cd(directory oriented commands), cp, mv, rm ( basic file-handling commands)

 

1) cut: selected character나 field들을 standard input이나 file로부터 추출한다.

-> -d 뒤에는 구분자가 오며, f1..f6등은 구분자로 나눠진 index를 의미한다.

 

2) tr: translates or delete character

우리는 cut과 tr cmd를 이용해서 MemFree의 value를 얻을 수 있다.
:를 \n으로 변환하였음을 확인할 수 있다.

 

#Awk (Aho-Weinberger-Kerighan)

awk는 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작하거나 데이터화하는 것을 목적으로 사용하는 프로그램이다. 즉 데이터를 분류하여 연산/데이터 조작등의 액션을 수행하고 그 결과를 출력한다.

 

-> 아래와 같이 사용한다.

awk 'pattern {action}'

awk '$3>0 {print $1,$2,$3}'

-> $3이 0인 이름만 출력하라, $3이 0보다 클 때 $2*$3을 연산한 결과를 출력하라...등의 예시가 존재한다.

 

1) 사용하는 변수

 - Built-in : NF (number of fields), NR(number of input record seen)

-  Fields: $0, $1, $2...

 

2) printf format conversion

: %c, %d, %o...

 

- cat sample | awk 'NR!=2{print $1,$2*$3,NF}'

 : 이는 sample을 읽어들여 record가 2가 아닌 값을 출력하고, field 개수도 출력한다.

 

- cat sample | awk '$3>0{printf("pay for %s is %.3f",$1,$3*$2)'

: 이는 field 3가 0을 넘을때만, 각각의 값을 출력한다.

 

+) Text를 비교할때는 $1~"son" 등으로 ~를 이용해 문자열을 비교한다.

-> 공백을 기준으로 $1,$2..등의 field가 된다.

 

field와 record는 다음과 같이 분류할 수 있다.

 

+) 참고 블로그

https://recipes4dev.tistory.com/171

 

리눅스 awk 명령어 사용법. (Linux awk command) - 리눅스 파일 텍스트 데이터 검사, 조작, 출력.

1. awk 명령어. 대부분의 리눅스 명령들이, 그 명령의 이름만으로 대략적인 기능이 예상되는 것과 다르게, awk 명령은 이름에 그 기능을 의미하는 단어나 약어가 포함되어 있지 않습니다. awk는 최

recipes4dev.tistory.com

 

#Alias

: command가 너무 길거나 일일히 치기 힘든 경우에 별칭을 붙여서 쉽게 실행할 수 있도록 만드는데, 이를 Alias라고 한다.

이름을 붙인 뒤에는 다른 어떤 command처럼 사용한다.

alias 별명='command 조합'
unalias 별명

alias l='ls -CF'
alias ls='ls --color=auto'
alias mm='date | cut -d" " -f2'

 

 

#First Script

- Script를 작성할때 가장 먼저 작성해야하는 것을 shebang/hashbang이라고 한다.

: shell script를 실행할때, subshell이라는 새로운 프로세스를 생성하는데 이 첫번째 줄이 shell을 시작하고 command를 실행하라고 말해주는 역할을 하는 것이다.

 

#!/bin/bash
echo "hello world!"
echo "I am done now!"


chmod +x hello.sh
./hello.sh  #이를 통해 shell script속 command 가 실행된다.

 

#Positional Parameters

: 파라미터로 받는 인자에 각각 번호가 붙게 되고, 이는 ${digit}으로 표현한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#Shell Parameters : Special

- single character로 이루어진 special parameter들이 존재한다.

- $0: 현재 shell script 번호

- $# : positional parameter 개수

- $* : 모든 positional parameter

- $? : 최근 실행된 command의 exit status

- $$ : 현재 process의 pid

 

#Example 1

-> directory에 존재하는 파일들을 하나로 압축하는 것을 확인할 수 있다.

- $1은 positional parameter로, 받은 인자의 첫번째 자리를 의미한다.

+) tar -cvf ${압축후 파일명} ${압축할 파일이나 폴더명}

 

 

#Example 2

- 여기서 awk 뒤의 single quote는 positional parameter가 아닌 awk 자체의 문법을 따른다.

- stat $1이 inum이 된다. 따라서 inum.sh의 stat의 출력을 뒤의 awk에 넘겨준다.

: 따라서 $inum에는 inum.sh의 inode값이 저장되게 된다.

 

#User Input Example

: Shell은 user input을 읽어올 수 있게 해준다

#shell에서 사용할때
read varname [more vars]

#script에서 사용할때
read -p "prompt" varname1 varname2...

#! /bin/bash
read -p "enter your name:" first last
echo "First name:" $first
echo "Last name:" $last

 

#script example 3

'Computer Science > OpenSource+Git' 카테고리의 다른 글

Conditional Construct  (0) 2021.12.11
Linux Command and Redirection  (0) 2021.12.11
shell command 확장과 명령어 치환  (0) 2021.12.11
Shell Environment  (0) 2021.12.11
Git Branch Command  (0) 2021.10.24