본문 바로가기

Linux/Bash shell

[Linux-vim] vim에디터 사용하기 6 - curl, awk, yad(basic, entry, form), pattern comparison(regular expression)

# 정리 

** 프로토콜 : 컴퓨터들 간의 원활한 통신을 위해 지키기로 약속한 규약(ex. HTTP, HTTPS, FTP, FTPS, STMP 등).
** yad = Yet another Dialog
** 프롬프트(prompt) : 사용자의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시.
** 명령 프롬프트(command prompt) : 컴퓨터 터미널 또는 터미널 에뮬레이터의 커멘드 라인 인터페이스(CLI)의 명령줄 대기모드를 말한다.
** 정규식(정규표현식) 이란?
 - 문자열의 집합을 표현하는데 사용하는 언어화된 규칙(형식 언어)이다.
 - 다수의 문자열에 대해 반복적인 처리가 필요한 '대조', '검색', '치환' 과정에서 주로 사용된다. 
** 추가 기능을 추가 하는 방법
 - java -  라이브러리 파일 추가 
 - JS - 00.js 파일 추가 혹은 라이브러리 URL 등록 
 - shell - 패키지 인스톨

# curl - 데이터 통신 
//프로토콜을 이용해 네트워크 상의 정보를 읽어오는데 사용하는 명령어이다.
 - ( Java - ajax / JS - http객체 )로 정보를 읽어오는 것과 유사하다 .
//패키지를 설치해야 사용할 수 있다.
 - $ sudo apt install -y curl 
//주소를 입력해서 페이지 정보를 받아올 수 있다.
 - naver, google, 로컬서버주소 등..


# pattern - 패턴 비교 
//정규식을 활용하여 패턴을 파악한다.
 - validate(검증) 기능을 구현할 때 많이 사용된다.
//(정규식) ^$ : ^(패턴시작) ~내용~ $(패턴 종료)
//if문으로 패턴 조건 확인 시 [[ =~ ]]를 사용하며, if와 [[ ]], [[ ]] 안 전부 띄어쓰기 넣어줘야한다.


# awk - 데이터 추출 
< *중요* 쉘스크립트에서 지원하는 GUI (yad) 와 경량화 DB (sqlite)에서 데이터를 보내주는 형식이 "|"로 구분되어있어, 많이 사용하게 된다. > 
//지정된 구분자로 잘라서 텍스트 추출할 수 있다.
 - ( ~ | awk 'BEGIN {FS="구분자"} {print $숫자}' )형태로 사용한다.
 - 변수 안에 있는 덩어리 데이터를 추출하는 것이 가능해진다.
명령 프롬프트에서도 실행해볼 수 있다.
// ( IFS="| " read -ra rows <<< $vos )는 한 줄로 다적어야한다.
- (-ra옵션) ReadArray 옵션 : 우측 변수의 텍스트 정보를 읽어, 파이프와 공백을 이용해 구분 데이터를 구분한다.
- 조건에  구분자 "|"와 " "가 같이 들어간 것이다.
- 도출 결과에는 "|"가 다 사라지므로, 파이프"|"를 공백으로 대체해서 배열 변수에 넣으라는 의미와 같은 명령이다.


# yad
<yad 설정 문장은 줄 바꿈을 하면 인식하지 못한다.>
(1. Basic) 
//쉘의 기본적인 GUI 로 패키지 추가 설치가 필요하다. 
 - $sudo apt install -y yad
- 설치 완료 후, $yad 하면 기본 알림창이 뜨는 것을 확인 할 수 있다.
//버튼 입력에 따른 결과값(result=$?)을 통해 분기를 만들 수 있다.
 - ok : 0 / cancel : 1의 값을 가진다.
//옵션으로 다양한 형태의 창을 만들 수 있다 (아래 예문은 삭제창 만들기).
 - (--title옵션) 창의 제목을 정해줄 수 있다.
 - (--width옵션) 창의 폭을 정해줄 수 있다.

(2. Entry option) 
// 한 줄의 텍스트를 입력할 수 있게 설정해줄 수 있다. (JS의 prompt()와 유사)
 - (--text) text옵션으로 엔트리 제목을 넣을 수 있다.
 - 기본 값을 넣으면 변경 입력이 안되고 옵션이 있는 것처럼 뜨므로, 개발 후에 남기지 않도록 주의해야한다.
//entry 설정이 텍스트 부분들을 담당하고, result가 버튼 값을 담당한다.

(3. Form option)  
<옵션은 세가지 형태를 혼용할 수 있으나 1번을 권장.(--옵션명="설정값"/--옵션명=설정값 /--옵션명 "설정값")>
//(--from) & (--field) 옵션을 사용하며, --entry 옵션과 달리 두 개 이상의 값을 넣을 때 사용한다.
- 기본값을 부여할 때는 필드 선언 뒤에 필드를 선언한 순서대로 넣어주면된다.
//옵션 종류
- (--field="필드값:CB ~ "선택지1" "선택지2" ...) 형태로 특정 필드값의 세부 선택지를 만든다.
- (--field="필드 값:CHK" ~ TRUE 또는 FALSE) 형태로 특정 필드값의 체크박스를 만둔다.
  * TRUE / FALSE : 체크박스의 기본 상태 설정
- (--field="필드 값:FL" ~ "파일 검색창 기본 경로")  형태로 파일을 선택할 수 있게 만든다.
  * FL(file) 옵션 - 기본 경로는 ROOT( / )로 시작해야하는 것에 주의 (ex. /home/pi)
//받은 form 정보는 |awk 옵션으로 잘라서 사용하게 된다.

 

 

 

** 프로토콜 : 컴퓨터들 간의 원활한 통신을 위해 지키기로 약속한 규약(ex. HTTP, HTTPS, FTP, FTPS, STMP 등).

 

# curl - 데이터 통신 

//프로토콜을 이용해 네트워크 상의 정보를 읽어오는데 사용하는 명령어이다.

 - ( Java - ajax / JS - http객체 )로 정보를 읽어오는 것과 유사하다 .

//패키지를 설치해야 사용할 수 있다.

 - $ sudo apt install -y curl 

//주소를 입력해서 페이지 정보를 받아올 수 있다.

 - naver, google, 로컬서버주소 등..

설치 화면, 구글 접속, 로컬 주소 접속

 

//로컬 주소로 임의의 데이터 통신 실습

 > springs 준비 

  - 프로젝트 pom에 jackson 디피던시 3종 설치 > VO생성, 컨트롤러로 List타입 데이터 return 

  - 배정된 서블릿 주소로 넘어오는 데이터 확인

 > 터미널 확인 (sh 파일 실행으로 json 데이터 확인)

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

#pi@raspberry:~/shellPro $ sudo apt install -y curl

curl http://000.000.00.0:8090/board/json_sh18curl.do

echo

echo "----------------------------"
curl http://000.000.00.0:8090/board/json_sh18curl.do |jq '.'

echo "----------------------------"
curl http://000.000.00.0:8090/board/json_sh18curl.do |jq '.[0].title'

echo "----------------------------"
curl http://000.000.00.0:8090/board/json_sh18curl.do |jq '.[1].content'

echo "----------------------------"
curl http://000.000.00.0:8090/board/json_sh18curl.do |jq '.[2].writer'


exit 0

 

 


** 추가 기능을 추가 하는 방법

 - java -  라이브러리 파일 추가 

 - JS - 00.js 파일 추가 혹은 라이브러리 URL 등록 

 - shell - 패키지 인스톨

 

** 정규식(정규표현식) 이란?

 - 문자열의 집합을 표현하는데 사용하는 언어화된 규칙(형식 언어)이다.

 - 다수의 문자열에 대해 반복적인 처리가 필요한 '대조', '검색', '치환' 과정에서 주로 사용된다. 

 

 

# pattern - 패턴 비교 

//정규식을 활용하여 패턴을 파악한다.

 - validate(검증) 기능을 구현할 때 많이 사용된다.

//(정규식) ^$ : ^(패턴시작) ~내용~ $(패턴 종료)

//if문으로 패턴 조건 확인 시 [[ =~ ]]를 사용하며, if와 [[ ]], [[ ]] 안 전부 띄어쓰기 넣어줘야한다.

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

read -p "Input date[ex.2202-03-14]:" date

#date="2022-03-14d"

echo $date

pat_date="^[0-9]{4}-[0-9]{2}-[0-9]{2}$"

#[[ =~  ]]

if [[ $date =~ $pat_date ]] ; then
echo "good"
else
echo "bad"
fi


exit 0

 

 


# awk - 데이터 추출 

< *중요* 쉘스크립트에서 지원하는 GUI (yad) 와 경량화 DB (sqlite)에서 데이터를 보내주는 형식이 "|"로 구분되어있어, 많이 사용하게 된다. > 

//지정된 구분자로 잘라서 텍스트 추출할 수 있다.

 - ( ~ | awk 'BEGIN {FS="구분자"} {print $숫자}' )형태로 사용한다.

 - 변수 안에 있는 덩어리 데이터를 추출하는 것이 가능해진다.

명령 프롬프트에서도 실행해볼 수 있다.

 

// ( IFS="| " read -ra rows <<< $vos )는 한 줄로 다적어야한다.

- (-ra옵션) ReadArray 옵션 : 우측 변수의 텍스트 정보를 읽어, 파이프와 공백을 이용해 구분 데이터를 구분한다.

- 조건에  구분자 "|"와 " "가 같이 들어간 것이다.

- 도출 결과에는 "|"가 다 사라지므로, 파이프"|"를 공백으로 대체해서 배열 변수에 넣으라는 의미와 같은 명령이다.

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

echo "kim|99|88|77" |awk 'BEGIN {FS="|"} {print $1}' 

echo "----------------------------"
vo="kim|99|88|77"

echo $vo |awk 'BEGIN {FS="|"} {print $1}'
echo $vo |awk 'BEGIN {FS="|"} {print $2}'
echo $vo | awk 'BEGIN {FS="|"} {print $3}'
echo $vo | awk 'BEGIN {FS="|"} {print $4}'

echo "----------------------------"
name=$(
echo $vo |awk 'BEGIN {FS="|"} {print $1}'
)
kor=$(
echo $vo |awk 'BEGIN {FS="|"} {print $2}'
)
eng=$(
echo $vo |awk 'BEGIN {FS="|"} {print $3}'
)
math=$(
echo $vo |awk 'BEGIN {FS="|"} {print $4}'
)
echo $name $kor $eng $math

echo "----------------------------"
vos="kim1|99|88|77 kim2|11|22|33"

echo "vos.length:" ${#vos[@]}
echo "vos:" ${vos[*]}

IFS="| " read -ra rows <<< $vos

echo "rows.length:" ${#rows[@]}
echo "rows:" ${rows[*]}


exit 0

 

 


** yad = Yet another Dialog

 

# yad - 1. Basic 

//쉘의 기본적인 GUI 로 패키지 추가 설치가 필요하다. 

 - $sudo apt install -y yad

- 설치 완료 후, $yad 하면 기본 알림창이 뜨는 것을 확인 할 수 있다.

//버튼 입력에 따른 결과값(result=$?)을 통해 분기를 만들 수 있다.

 - ok : 0 / cancel : 1의 값을 가진다.

//옵션으로 다양한 형태의 창을 만들 수 있다 (아래 예문은 삭제창 만들기).

 - (--title옵션) 창의 제목을 정해줄 수 있다.

-  (--width옵션) 창의 폭을 정해줄 수 있다.

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

#yad - Yet another Dailog
#sudo apt install -y yad
#OK - 0 / cancel - 1

touch sh21.txt
ls

#alert=$(yad) result=$?
alert=$(yad --width 300 --title "Remove?") result=$?
echo $result $alert

if ((result==0));then
	echo "OK"
	rm sh21.txt
	ls
else	
	echo "Cancel"
fi


exit 0

 

 

------------------------------------------------

** 프롬프트(prompt) : 사용자의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시.

** 명령 프롬프트(command prompt) : 컴퓨터 터미널 또는 터미널 에뮬레이터의 커멘드 라인 인터페이스(CLI)의 명령줄 대기모드를 말한다.

 

# yad - 2. Entry option 한 줄 텍스트 입력 창

// 한 줄의 텍스트를 입력할 수 있게 설정해줄 수 있다. (JS의 prompt()와 유사)

 - (--text) text옵션으로 엔트리 제목을 넣을 수 있다.

 - 기본 값을 넣으면 변경 입력이 안되고 옵션이 있는 것처럼 뜨므로, 개발 후에 남기지 않도록 주의해야한다.

 * 팝업창에 OK버튼을 눌렀을 때 정보가 전송되도록 되어있음.

//entry 설정이 텍스트 부분들을 담당하고, result가 버튼 값을 담당한다.

 

 

------------------------------------------------

# yad - 3. Form option 복수의 데이터/타입 입력 창

<yad 설정 문장은 줄 바꿈을 하면 인식하지 못한다.>

<옵션은 세가지 형태를 혼용할 수 있으나 1번을 권장.(--옵션명="설정값"/--옵션명=설정값 /--옵션명 "설정값")>

//(--from) & (--field) 옵션을 사용하며, --entry 옵션과 달리 두 개 이상의 값을 넣을 때 사용한다.

- 기본값을 부여할 때는 필드 선언 뒤에 필드를 선언한 순서대로 넣어주면된다.

//옵션 종류

- (--field="필드값:CB ~ "선택지1" "선택지2" ...) 형태로 특정 필드값의 세부 선택지를 만든다.

- (--field="필드 값:CHK" ~ TRUE 또는 FALSE) 형태로 특정 필드값의 체크박스를 만둔다.

  * TRUE / FALSE : 체크박스의 기본 상태 설정

- (--field="필드 값:FL" ~ "파일 검색창 기본 경로")  형태로 파일을 선택할 수 있게 만든다.

  * FL(file) 옵션 - 기본 경로는 ROOT( / )로 시작해야하는 것에 주의 (ex. /home/pi)

//받은 form 정보는 |awk 옵션으로 잘라서 사용하게 된다.

#!/bin/bash
clear 
pwd
echo $0

echo "----------------------------"

form=$(yad --width 300 --title "Form" --form --field="Language:CB" --field="java:CHK" --field="Linux:CHK" --field="name" --field="tel" --field="ls -l:FL" "Java!Adroid!Linux" TRUE False "kim" "031" "/home/pi/practice" ) result=$?

echo entry: $form
echo result: $result

if ((result==0)); then
	echo $form |awk 'BEGIN {FS="|"} {print $1}'
	echo $form |awk 'BEGIN {FS="|"} {print $2}'
	echo $form |awk 'BEGIN {FS="|"} {print $3}'
	echo $form |awk 'BEGIN {FS="|"} {print $4}'
	echo $form |awk 'BEGIN {FS="|"} {print $5}'
	echo $form |awk 'BEGIN {FS="|"} {print $6}'

else
	echo "cancel"
fi


exit 0

 

 


#mission 1 : (이름, 국, 영, 수) 입력 폼 만들기 > 입력값 변수할당 > 한줄의 출력문(이름,국,영,수,총점,평균)으로 출력

#mission 2 : (아이디, 비번, 이름, 전화) 입력 폼 만들기  > 입력값 변수할당 > 한줄의 출력문(아이디, 비번, 이름, 전화) 으로 출력

#!/bin/bash
clear 
pwd
echo $0

echo "------------mission 1- score----------------"

scoreform=$(yad --title "student score" --form --field "name:CB" --field "kor" --field "eng" --field "math" --field "totalck:CHK" --field "avgck:CHK" --field "dataFile:FL" "kim!lee!han" "99" "88" "77" true false "/home/pi/shellPro") result1=$?
echo scoreform: $scoreform
echo result1: $result1

if ((result==0)); then
	name=$(echo $scoreform |awk 'BEGIN {FS="|"} {print $1}')
	kor=$(echo $scoreform |awk 'BEGIN {FS="|"} {print $2}')
	eng=$(echo $scoreform |awk 'BEGIN {FS="|"} {print $3}')
	math=$(echo $scoreform |awk 'BEGIN {FS="|"} {print $4}')
	totalchk=$(echo $scoreform |awk 'BEGIN {FS="|"} {print $5}')
	avgchk=$(echo $scoreform |awk 'BEGIN {FS="|"} {print $6}')
	dataFile=$(echo $scoreform |awk 'BEGIN {FS="|"} {print $7}')

	total=$((kor+eng+math))
	avg=$((total/3))
	grade="F"
	if ((avg>=90));then
		grade="A"
	elif ((avg>=80));then
		grade="B"
	elif ((avg>=70));then
		grade="C"
	elif ((avg>=60));then
		grade="D"
	else
		grade="F"
	fi

	printf "name[%s], kor[%d], eng[%d], math[%d], totalchk[%s], total[%d], avgchk[%s], avg[%.2f], grade[%s], dataFile[%s]\n" $name $kor $eng $math $totalchk $total $avgchk $avg $grade $dataFile

else
	echo "cancel"
fi


echo "------------mission 2- member info----------------"

memberinfo=$(yad --title "member info" --form --field "id" --field "pw" --field "name" --field "tel" --field "private info agree:CHK" --field "profileIMG:FL" "admin" "hi123456" "kim" "031" false "/home/pi/shellPro") result2=$?
echo scoreform: $memberinfo
echo result2: $result2

if ((result==0)); then
	id=$(echo $memberinfo |awk 'BEGIN {FS="|"} {print $1}')
	pw=$(echo $memberinfo |awk 'BEGIN {FS="|"} {print $2}')
	name=$(echo $memberinfo |awk 'BEGIN {FS="|"} {print $3}')
	tel=$(echo $memberinfo |awk 'BEGIN {FS="|"} {print $4}')
	privatechk=$(echo $memberinfo |awk 'BEGIN {FS="|"} {print $5}')
	profile=$(echo $memberinfo |awk 'BEGIN {FS="|"} {print $6}')

	echo "id:"$id "pw:"$pw "name:"$name "tel:"$tel "privatechk:"$privatechk "profile:"$profile
else
	echo "cancel"
fi



exit 0​