test@test:~/chap20$ ls -al ../.ba*
-rw------- 1 test test 3231 Jan 6 10:58 ../.bash_history
-rw-r--r-- 1 test test 220 Apr 4 2018 ../.bash_logout
-rw-r--r-- 1 test test 3771 Apr 4 2018 ../.bashrc
→ ../.ba* 매개변수는 ls 명령에서 이름이 .ba로 시작하는 파일만 보여주도록 지시한다.
test@test:~/chap20$ echo "This is a test" | sed -n '/test/p'
This is a test
test@test:~/chap20$ echo "This is a test" | sed -n '/guest/p'
test@test:~/chap20$ echo "This is a test" | gawk '/test/{print $0}'
This is a test
test@test:~/chap20$ echo "This is a test" | gawk '/test/{print $0}'
This is a test
test@test:~/chap20$ echo "This is a test" | gawk '/Test/{print $0}'
test@test:~/chap20$ echo "This is a test" | sed -n '/test/p'
This is a test
test@test:~/chap20$ echo "This is a test" | sed -n '/Test/p'
test@test:~/chap20$ echo "This is number1 channel" | sed -n '/1 c/p'
This is number1 channel
test@test:~/chap20$ echo "This is number1 channel" | gawk -n '/ channel/{print $0}'
This is number1 channel
. * [ ] ^ $ { } \ + ? #
⇒ 텍스트 패턴에 이러한 문자를 그대로 사용할 수 없다.
특수 문자를 일반 문자처럼 사용하고 싶으면 이스케이프 ( \ ) 문자를 사용해야 한다.
test@test:~/chap20$ echo "\ is a special character" | sed -n '/\\/p'
\ is a special character
test@test:~/chap20$ echo "\ is a special character" | gawk -n '/\\/{print $0}'
\ is a special character
test@test:~/chap20$ echo "The book store" | sed -n '/^T/p'
The book store
test@test:~/chap20$ cat test3
this is a test line
hello is a test line
career is a test line
git is a test line
test@test:~/chap20$ sed -n '/^git/p' test3
git is a test line
test@test:~/chap20$ echo "This is a test book" | sed -n '/book$/p'
This is a test book
test@test:~/chap20$ cat test3
this is a test boy
hello is a test woman
career is a test girl
git is a test man
test@test:~/chap20$ sed -n '/man$/p' test3
hello is a test woman
git is a test man
test@test:~/chap20$ sed '/^$/d' test3
this is a test boy
hello is a test woman
career is a test girl
git is a test man
test@test:~/chap20$ cat test3
this is a test boy
hello is a test woman
career is a test girl
git is a test man
test@test:~/chap20$ gawk '/.man/{print $0}' test3
hello is a test woman
git is a test man
test@test:~/chap20$ cat test3
There is 3 bottles
i am no.1
you have 5 dishes
test@test:~/chap20$ sed -n '/[123]/p' test3
There is 3 bottles
i am no.1
test@test:~/chap20$ echo "Yes" | sed -n '/[Yy][Ee][sS]/p'
Yes
test@test:~/chap20$ echo "YeS" | sed -n '/[Yy][Ee][sS]/p'
YeS
클래스에 포함된 문자를 찾는 대신 클래스에 없는 문자를 찾을 수 있다.
⇒ 문자 클래스 범위의 시작 부분에 캐럿 문자를 놓으면 된다.
test@test:~/chap20$ sed -n '/^[^a-z]/p' test3
There is 3 bottles
test@test:~/chap20$ sed -n '/^[^A-Z]/p' test3
i am no.1
you have 5 dishes
test@test:~/chap20$ cat test1
12345
123561
2134
12512
00000
test@test:~/chap20$ sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' test1
12345
12512
00000
[[:alpha:]] : 모든 알파벳 글자와 일치
[[:alnum:]] : 영숫자 및 문자 0-9, A-Z, a-z 와 일치
[[:blank:]] : 빈 칸이나 탭 문자와 일치
[[:digit:]] : 0-9까지의 숫자와 일치
[[:lower:]] : 소문자와 일치 (a-z)
[[:upper:]] : 대문자와 일치 (A-Z)
[[:print:]] : 인쇄할 수 있는 모든 문자와 일치
[[:space:]] : 모든 화이트스페이스 문자와 일치 ( 빈 칸, 탭, NL, FF, VT, CR )
[[:punct:]] : 문장 부호 문자와 일치
test@test:~/chap20$ echo "abc" | sed -n '/[[:alnum:]]/p'
abc
test@test:~/chap20$ echo "abc" | sed -n '/[[:upper:]]/p'
test@test:~/chap20$ echo "abc" | sed -n '/[[:lower:]]/p'
abc
test@test:~/chap20$ echo "abc123" | sed -n '/[[:digit:]]/p'
abc123
test@test:~/chap20$ echo "ik" | sed -n '/ie*k/p'
ik
test@test:~/chap20$ echo "iek" | sed -n '/ie*k/p'
iek
test@test:~/chap20$ echo "ieek" | sed -n '/ie*k/p'
ieek
test@test:~/chap20$ echo "ieeek" | sed -n '/ie*k/p'
ieeek
## 이 조합은 어떤 문자가 몇 개든 나와도 일치하는 패턴을 제공한다.
test@test:~/chap20$ echo "this is a regular pattern expression" | sed -n '/regular.*expression/p'
this is a regular pattern expression
test@test:~/chap20$ echo "bt" | gawk '/be?t/{print $0}'
bt
test@test:~/chap20$ echo "bet" | gawk '/be?t/{print $0}'
bet
test@test:~/chap20$ echo "beet" | gawk '/be?t/{print $0}'
더하기 기호는 문자가 한 번 이상 나타날 수 있지만 한 번 이상은 있어야 한다는 것
test@test:~/chap20$ echo "beeet" | gawk '/be+t/{print $0}'
beeet
test@test:~/chap20$ echo "bet" | gawk '/be+t/{print $0}'
bet
test@test:~/chap20$ echo "bt" | gawk '/be+t/{print $0}'
확장 정규표현식에서 사용할 수 있는 중괄호
test@test:~/chap20$ echo "bt" | gawk --re-interval '/be{1}t/{print $0}'
test@test:~/chap20$ echo "bet" | gawk --re-interval '/be{1}t/{print $0}'
bet
test@test:~/chap20$ echo "beet" | gawk --re-interval '/be{1}t/{print $0}'
test@test:~/chap20$ echo "beet" | gawk --re-interval '/be{1,2}t/{print $0}'
beet
test@test:~/chap20$ echo "beeet" | gawk --re-interval '/be{1,2}t/{print $0}'
test@test:~/chap20$ echo "The cat is sleeping" | gawk '/cat|dog/{print $0}'
The cat is sleeping
test@test:~/chap20$ echo "The dog is sleeping" | gawk '/cat|dog/{print $0}'
The dog is sleeping
test@test:~/chap20$ echo "The sheep is sleeping" | gawk '/cat|dog/{print $0}'
# 완전한 영어 단어인 Saturday나 그 약칭인 Sat 중 어느 것이든 받아들인다.
test@test:~/chap20$ echo "Sat" | gawk '/Sat(urday)?/{print $0}'
Sat
test@test:~/chap20$ echo "Saturday" | gawk '/Sat(urday)?/{print $0}'
Saturday
test@test:~/chap20$ echo $PATH | sed 's/:/ /g'
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin
test@test:~/chap20$ cat countfiles.sh
#!/bin/bash
# Count number of files in your PATH
mypath=$(echo $PATH | sed 's/:/ /g')
count=1
# 1차 for문
for directory in $mypath
do
# ls 출력 결과를 check 변수에 저장
check=$(ls $directory)
# 2차 for문
for item in $check
do
# 갯수 1개씩 증가
count=$[ $count + 1]
done
echo "$directory has $count files"
count=0
done
test@test:~/chap20$ ./countfiles.sh
/usr/local/sbin has 1 files
/usr/local/bin has 0 files
/usr/sbin has 156 files
/usr/bin has 703 files
/sbin has 225 files
/bin has 170 files
/usr/games has 0 files
/usr/local/games has 0 files
/snap/bin has 6 files
## 허용 가능 전화번호 Pattern
# 000-0000-0000
# 000 0000 0000
# 000.0000.0000
# 00012345678
test@test:~/chap20$ cat isPhoneNum.sh
#!/bin/bash
# 010-1234-5678
gawk --re-interval '/[0-9]{3}(| |-|\.)[0-9]{4}(| |-|\.)[0-9]{4}/{print $0}
test@test:~/chap20$ echo "317-4555-1234" | ./isPhoneNum.sh
317-4555-1234
test@test:~/chap20$ echo "317 4555 1234" | ./isPhoneNum.sh
317 4555 1234
test@test:~/chap20$ echo "317.4555.1234" | ./isPhoneNum.sh
317.4555.1234
test@test:~/chap20$ echo "31745551234" | ./isPhoneNum.sh
31745551234