리눅스는 문자열 처리 부분에 있어서 윈도우 쉘 보다 다양한 방법을 제공 합니다.
쉘 자체적으로 제공하는 문자열 가공 명령이 있고 그외에 외부 프로그램에서 제공하는 문자열 가공 명령들이 있습니다.
각 명령들을 보다보면 중복 적인 기능들이 많아 혼동을 주는 경우가 있긴 하지만 각 방식 중에 자신에게 맞는 방법을 찾으시면
될 것 같습니다.
일딴 문자열 가공에 대해서 바로 들어 가기 전에 문자열 가공의 기본적인 확인 방법 부터 설명 드리겠습니다.
------------------------------------
#!/bin/sh
directory_info=`ls -lt / | grep -i var`
echo $directory_info
------------------------------------
위에 스크립트는 루트 경로에 대하여 ls 명령을 수행하고 수행한 결과 중에 var 라는 문자열이 들어간 줄을 directory_info 변수에 저장 하고 화면에 결과를 보여 주는 스크립트 입니다.
위에서 보시다 시피 문자열 가공의 최초 시작은 "원하는 내용이 포함된 문자열을 받아 오는 것" 이고 끝은 echo를 사용하여 " 문자열 내용을 확인 하는 것" 입니다.
간단한 것 같지만 미리 알고 가는 것과 시행착오를 통해 배우는 것과 아무래도 시간 차이가 있는 내용입니다.
문자열 가공전/후 echo 명령으로 문자열이 어떻게 가공 되고 있는지 꼭 확인 하는 습관을 들이도록 합니다.
이제 본격적으로 문자열 가공에 대해서 이야기 해보록 하겠습니다.
일반적으로 쉘에서 많이 쓰이는 기법을 사용해서 문자열을 받아와 보도록 하겠습니다.
1. 파이프 명령을 이용한 문자열 받아 오기.
------------------------------------
#!/bin/sh
get_uid=`cat /etc/passwd | grep -i oracle | cut -d ":" -f 3`
echo $get_uid
------------------------------------
위 스크립트는 파이프 명령을 사용하여 passwd 파일에서 oracle 이라는 문자열이 포함 된 줄을 찾고 ":"을 구분자로 나눠서 3번째(UID) 값을 출력 합니다. passwd 파일 전체에 대한 내용을 다 가져오는게 아닌 필요한 부분을 가져 오고자 할 때 파이프(|) 명령을 활용 하시면 됩니다.
파이프를 이용하여 문자열을 가공 할 때는 파이프 단계 하나 하나 echo를 해 가면서 결과 값을 보면서 하시는 게 좋습니다.
위에 예제에 대하여 중간 단계를 넣으면 이런 식이 되겠죠.
------------------------------------
#!/bin/sh
echo `cat /etc/passwd`
echo `cat /etc/passwd | grep -i oracle`
get_uid=`cat /etc/passwd | grep -i oracle | cut -d ":" -f 3`
echo $get_uid
------------------------------------
2. 텍스트내의 문자열을 순차적으로 가져 오기.
이 스크립트를 수행하기 위해 2가지를 예제 파일을 생성 합니다.
스크립트명 : 1.txt
--------------------------------------
/var
/ect
/home
스크립트명 : list.sh
---------------------------------------
#!/bin/sh
for Directioy_list in `cat ./1.txt`
do
echo "ls -lt $Directioy_list"
done
---------------------------------------
For 문을 사용한 예제 인데요 갑작스럽게 루프가 튀어 나오긴 했지만....
간략하게 설명을 드리면 For 문은 in 다음에 주어진 값을 순차적으로 대입 하면서 반복을 하는 루프 명령 입니다.
in 다음에 주어지는 값을 간단하게 Cat 명령으로 주어 보았는데요.
예제의 실행 결과는 다음과 같습니다.
--------------------------------------
ls -lt /var
ls -lt /etc
ls -lt /bin
--------------------------------------
텍스트에서 특정 문자열을 가져올 때 순차적으로 가져와야 하는 경우 사용되는 방법이니 기억해 두시면 유용 합니다.
3. 날짜 함수에서 문자열 가져 오기.
날짜나 시간 관련된 정보는 운영체제의 내장 명령으로 부터 값을 가져 오는데 일반적인 방법은 다음과 같습니다.
--------------------------------------------------------
#!/bin/sh
current_date="`date +%Y/%m/%d`"
yesterday_date_eng="`date +%Y/%m/``expr \`date +%e\` \- 1`"
yesterday_date_nor="`date +%Y/%m/``expr \`date +%e\` \- 1`"
yesterday_date_ago="`date --date=\"1 days ago\"`"
echo $current_date
echo $yesterday_date_eng
echo $yesterday_date_nor
echo $yesterday_date_ago
---------------------------------------------------------
실행 결과
---------------------------------------------------------
2012/04/23
2012/04/22
2012/04/22
2012. 04. 22. (ÀÏ) 13:16:52 KST
---------------------------------------------------------
위에 결과에서 볼 수 있듯이 함수에서 날짜를 가져 오는 방법은 여러가지 형식으로 가져 올 수 있습니다.
하지만 권장 드리는 사항은 날짜 관련 이식성이 필요하다면 expr 함수를 사용하는 형태로 날자를 계산하는 방식을 사용
할 필요가 있습니다. "1 day ago"를 사용하는 경우 bash 이 외의 쉘이나 일부 BSD 계열의 유닉스에서는 동작하지 않기 때문에
유의할 필요가 있습니다.
4. 표준입력 재지향 하기.
이 부분은 문자열 처리보다는 필요성에 의해서 사용됩니다.
예를 들면 파일을 읽어 들여서 파일의 내용이 타이핑 되게 하는 효과가 필요한 경우에 쓰이는데 , FTP 자동배치를 만든다던지 할 때
필요한 것들 입니다.
외부 글에서 예제를 따왔습니다.
----------------------------------------------------------
#!/bin/bash
# 'exec'로 표준입력 재지향 하기.
exec 6<&0 # 표준입력을 6번 파일 디스크립터로 링크.
exec < data-file # 표준입력을 "data-file"에서.
read a1 # "data-file"의 첫번째 줄을 읽음.
read a2 # "data-file"의 두번째 줄을 읽음.
echo
echo "다음은 파일에서 읽어 들인 것입니다."
echo "-----------------------------------"
echo $a1
echo $a2
echo; echo; echo
exec 0<&6 6<&-
# 6번 파일 디스크립터에 저장되어 있던 표준입력을 복구시키고,
# 다른 프로세스가 쓸 수 있도록 6번 파일 디스크립터를 프리( 6<&- )시킴.
# <&6 6<&- 라고 해도 됩니다.
echo -n "데이타를 넣으세요 "
read b1 # "read"는 이제 원래 자신의 동작인 표준입력에서 입력을 받습니다.(키보드)
echo "표준입력에서 읽은 값."
echo "---------------------"
echo "b1 = $b1"
echo
exit 0
------------------------------------------------------------------------------
상기 4가지 예만 잘 보아 두어도 외부 명령, 파일 , 표준입력 등 에서 필요한 문자열을 받아 드릴 수 있습니다.
문자열 가공 하기
일반적으로 문자열 가공에 사용되는 도구와 옵션을 하나씩 적어두고 부연 설명을 드리도록 하겠습니다.
1. cat 명령
윈도우의 Type 명령과 유사합니다. 간단하게 파일에 내용을 화면에 출력해 주는데 리다이렉션을 사용하면 파일을 생성 할 수 도 있습니다.
예제
------------------------------------------------
#!/bin/sh
root_id_information=cat /etc/passwd | grep -i root
------------------------------------------------
2.grep
텍스트 파일이나 문자열 배열 내에 패턴이 존재하는 라인을 찾아 표시해 줍니다.
※ 명령 형식
grep <옵션> <패턴> <파일명>
옵션
-v '패턴'을 포함하지 않는 행을 출력
-i 대소문자를 구분 않음
-n 줄 번호를 함께 출력
-I 파일명을 출력
패턴 형식
grep [abc]* a나 b나 c가 있는 라인
grep [0-9]* 0-9 사이 숫자가 있는 라인
grep [A-C]* A , B ,C 가 있는 라인
grep '^d' ^ 다음에 붙는 문자로 시작하는 줄을 출력
grep 'c$' $ 앞에 오는 문자로 끝나는 줄을 출력.
예제)
grep -i root /etc/passwd
ls -lt | grep -i root
ls -lt | grep '^d' - > d로 시작하는 줄 출력 ( 디렉토리 만 찾을 때 )
3. head
파일의 시작 라인에서 지정한 라인 까지를 출력해 주는 명령
예제 ) head -10 /var/adm/syslog.log
4.tail
헤드와 반대로 파일의 제일 끝에서 지정한 라인 까지를 출려해 주는 명령
옵션)
- 라인수 : 끝에서 부터 지정한 라인 수 만큼을 출력
+ 라인수 : 맨 첫라인 부터 카운트 하여 해당 라인서 부터 파일의 끝 까지를 출력
- f : 프로그램을 종료하지 않고 새로 추가 되는 라인이 있으면 해당 라인을 지속적으로 출력하는 명령 ( 취소시 ctrl+c )
※ 시스템 로그나 오라클 로그를 모니터링 할 때 활용 된다.
5. Cut
파일을 읽어들여 구분 문자열 혹은 문자열 위치를 기반으로 텍스트의 필드를 구분하고 각 필드 번호를 받아들여 해당 필드만을 출력하는
명령
옵션 )
-c 문자열의 위치를 값으로 추출
-d { 구분자 } -f { 필드 번호 } == 구분자는 텍스트의 필드를 구분하기 위한 문자열이고 필드 번호는 구분자에
의하여 구분된 필드의 순번이다.
기본적으로 텍스트파일내 필드 문자열 처리에 이용 한다.
문서내의 특정 구분자나 위치를 지정하여 파일을 읽어 표시한다.
예제 cut -d ":" -f 1,3 /etc/passwd ----- test 파일을 : 구분자로 필드를 구분하고 1 ,3 번 필드를 표시하라는 의미
6. paste
두개 이상의 파일을 읽어 들여 각 파일의 내용을 각각의 필드 형태로 합쳐 새로운 파일을 생성 하는 명령
옵션
-s 파일의 내용을 다른 파일의 이웃 필드로 붙인다.
-d 필드로 붙일시의 구분자를 정의 한다.
예제) paste -d : exam1 exam2
exam1의 내용
-------------
red
blue
green
exam2의 내용
-------------
1
2
3
결과값 )
red:1
blue:2
green:3
7.Sort
파일의 컬럼을 정렬하여 출력하는 명령.
옵션
-f 대소문자 구분 않음
-r 내림차순으로 정렬
-b 스페이스를 무시
-k 필드 번호 표시
-t <구분자> 필드간 구분자를 지정 - 필드가 스페이스 바나 텝으로 부분 안 파일 콤마나 세미 콜론등으로 지정되는
CSV 형태의 필드를 구분할때 필요.
-n 숫자 순서로 정렬
8.Sed
스트림형 화면 출력 에디터로 문자열에 지정된 부분만을 출력 하거나
특정 문자열을 바꾸어 출력하거나 컬럼에서 지정된 행을 빼고 출력 한다.
하지만 실제 파일에는 영향이 없다 >> 등을 활용하면 출력 결과를 따로 저장 가능하다.
옵션
p 행을 출력한다 ( -n 옵션과 함께 사용할 경우 선택 행만 출력 된다)
d 선택한 행을 삭제한다.
-f 파일안의 내용으로 Sed를 동작한다.
's/가/나/g' '가' 문자열을 '나' 문자열로 대체한다.
-e 다중 편집을 한다.
-q sed를 종료 한다.
예제)
목록중에 특정 문구를 포함 하는 라인만 출력.
sed -n '/문자열/p' sample.txt
목록중 1-3 라인을 삭제 후 나머지를 출력 하고자 한다면.
sed '1,3d' sample.txt
목록중 5번째 줄에서 끝 라인까지 삭제 하고 이전만 출력.
sed '5,$d' sample.txt
여기서 $는 텍스트의 마지막 줄을 의미
처음 4줄만 출력하고 sed 프로그램을 종료 하는 명령
sed '4q' sample.txt
특정 문자열이 표시된 라인을 삭제하고 출력 하는 예
sed '/서울/d' sample.txt
특정한 문자열을 다른 문자열로 대체 할때 file 이라는 예
sed 's/file/FILE/g' sample.txt
대소문자를 구분하도록 문자를 고유하게 지정 하는 방법 <> 를 사용
sed 's/\<file\>/FILE/g' sample.txt
1-6 라인 일부분만 변경하여 출력
sed '1,6s/서울시/서울특별시/g' sample.txt
특정 문자열을 대체하고 변경된 라인만을 출력
sed -n '1,6s/서울시/서울특별시/gp' sample.txt
SED 명령어를 반복하여 수행
sed -e 's/서울/서울시/g' -e 's/충남/충남시/g' sample
정규 문자.
^ 문자는 라인의 가장 처음을 의미
$ 문자는 라인의 가장 끝을 의미
9.awk
파일의 각 라인을 필드로 인식하여 이들 필드 및 칼럼을 조작하는 명령으로
특정 패턴의 조작이나 검색을 주목적으로 함.
명령어 구조 : awk '패턴 {actions}' "파일이름"
패턴 종류
BEGIN 특정 명령을 실행하기 전에 먼저 실행 시킨다.
END 특정 명령을 실행한 후 제시되는 문장을 실행 시킨다.
/정규표현식/ 정규 표현식의 패턴을 포함하는 라인에서 문장을 실행 시킨다.
패턴1 && 패턴2 1패턴과 2패턴을 동시에 만족시킬 때 문장을 실행 한다.
패턴1 || 패턴2 1패턴 혹은 2패턴중 하나를 만족시켜도 문장을 실행 시킨다.
!패턴 패턴과 일치 하지 않을 경우 문장을 실행 한다.
연산자 형태
+
-
/
*
A%B A를 B로 나눈 후 나머지 값
++ 어떤 변수 값을 1씩 증가
-- 어떤 변수 값을 1씩 감소.
A=B A=B
A+=B A=A+B
A-=B A=A-B
A*=B A=A*B
A/=B A=A/B
A%=B A=A%B
|| OR 연산
&& AND 연산
! NOT
A>B A가 B보다 크다
A>=B A가 B보다 크거나 같다
A<B A가 B보다 작다
A<=B A가 B보다 작거나 같다
A==B A와 B가 같다
A!=B A와 B가 다르다
awk의 내부 변수 종류
FILENAME 현재 처리 중인 파일 이름.
FS 필드 구분자
RS 레코드 구분자.
NF 현재 레코드에서의 필드 수
NR 현재 파일에서 전체 레코드수
OFS 출력시의 필드 구분자
ORS 출력시의 레코드 구분자
awk 사용 예제
awk '{print $1,$3}' sample 1번과 3번 필드 열을 출력 하라
awk '{print $0}' sample 전체 열을 출력 하라 ---- $0 와일드 카드로 이해 하셈
awk '$2 > 25 {print $1,$2}' 2번째 필드 에서 값중 25보다 큰 값을 가지면 1번 과 2번 필드를 출력 하라.
sed 's/입니다/ /g' sample | awk '$2>25 {print $1,$2}' sample
--- sed 명령을 수행하여 sample 파일의 입니다 라는 내용을 공백으로 바꾸고 파이프 명령으로 awk를 수행하여
2번째 필드 에서 값중 25보다 큰 값을 가지면 1번 과 2번 필드를 출력 하라.
awk '$2 > 25 {print $1"씨는",$2" 세 입니다"}'
--- 2번째 필드 에서 값중 25보다 큰 값을 가지면 1번 필드 문자열 뒤에 "씨는" 이라는 문자를 붙이고
2번 필드 뒤에는 " 세 입니다" 라는 문자열을 붙여 출력 하라.
awk 명령어 파일 생성 예제
----------------------------------------------------
BEGIN {
sum = 0;
line = 0;
}
{
sum += $2;
line ++;
}
END {
average = sum / line;
print "나이의 평균 : "average"세";
}
-----------------------------------------------------
awk 명령어 파일 실행 법.
awk -f 명령어 파일명.
10. wc
파일을 읽어 라인수, 문자수, 단어수를 표시해 주는 명령으로 grep등과 혼용하여 프로세스의 갯수나,
특정 패턴의 갯수를 세는데 사용 된다.
옵션)
-c 전체 문자수 출력
-l 전체 라인수 출력
-w 전체 단어 수 출력
11.uniq
결과 값에서 중복된 라인을 제거할 때 사용하는 명령으로 동일한 값이 존재하지 안도록 해야 할 때 사용한다.
옵션)
-c 몇번 중복되는지를 숫자로 표시함.
여기까지가 문자열을 받아들이는 방법과 문자열 가공에 사용되는 명령어 정리에 대한 글이었습니다.
일반적으로 상기 명령을 잘 쓸 수만 있으면 어지간한 정보에 대한 파싱이 가능합니다.
[출처] 문자열을 받아들이는 방법과 문자열 가공에 사용되는 명령어 정리.|작성자 썰사자
'IT > 리눅스마스터1급' 카테고리의 다른 글
리눅스 cat 명령어 사용법. (Linux cat command) - 리눅스 파일 내용 출력. (0) | 2023.08.17 |
---|---|
Linux - 명령어 결과에서 grep으로 찾은 라인의 위 아래 라인까지 가져오기 (0) | 2023.08.17 |
리눅스 awk 사용법 (0) | 2023.08.17 |
ssh 원격 명령 실행 (0) | 2023.08.16 |
perl - ssh접속해서 원격명령 실행 및 결과 받아오기 (0) | 2023.08.16 |