SHELL - 텍스트 처리 (3): sed 와 awk
9223 단어 학습 노트
sed 한 줄 의 내용 을 처리 할 때 현재 처 리 된 줄 을 임시 버퍼 에 저장 하 는 것 을 '모드 공간' 이 라 고 합 니 다.
처리 가 끝 난 후 버퍼 의 내용 을 화면 으로 보 낸 다음 다음 줄 의 내용 을 처리 합 니 다.
sed [ ] ' ' file
p ## ,
d ## ,
a ## , a ,
c ## ,c ,
i ## ,i ,
-i ##
[root@localhost mnt]# cat -n /etc/fstab
1
2 #
3 # /etc/fstab
4 # Created by anaconda on Wed May 7 01:22:57 2014
5 #
6 # Accessible filesystems, by reference, are maintained under '/dev/disk'
7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8 #
9 UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
[root@localhost mnt]# sed -n '/\:/p' /etc/fstab ## :
# Created by anaconda on Wed May 7 01:22:57 2014
[root@localhost mnt]# sed -n '/^#/p' /etc/fstab ## #
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
[root@localhost mnt]# sed -n '/^#/!p' /etc/fstab ## #
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
[root@localhost mnt]# sed -n '2,6p' /etc/fstab ## 2 6
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
[root@localhost mnt]# sed -n '2,6!p' /etc/fstab ## 2 6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
sed '/^UUID/d' /etc/fstab ## UUID
sed '/^#/d' /etc/fstab ## #
sed '/^$/d' /etc/fstab ##
sed '1,4d' /etc/fstab ##
[root@localhost mnt]# vim westos
[root@localhost mnt]# cat westos
hello
[root@localhost mnt]# sed '/hello/aworld' westos ## hello world
hello
world
[root@localhost mnt]# sed 's/hello/hello world/g' westos ## hello world
hello world
[root@localhost mnt]# sed 's/hello/hello
world/g' westos ## hello world
hello
world
[root@localhost mnt]# sed '/hello/chello world' westos ## hello hello world
hello world
[root@server mnt]# sed '/hello/iworld
westos' westos ## hello world westos
world
westos
hello
httpd 서비스의 포트 를 8080 으로 변경 합 니 다.
[root@localhost mnt]# vim http.sh
[root@localhost mnt]# cat http.sh
#!/bin/bash
yum install httpd -y &> /dev/null
sed -i "/^Listen/cListen $1" /etc/httpd/conf/httpd.conf && echo -e "Port changed $1 success"
systemctl restart httpd
[root@localhost mnt]# sh http.sh 8080
Port changed 8080 success
[root@localhost mnt]# vim http.sh
[root@localhost mnt]# sh http.sh 80
Port changed 80 success
명령
1. awk 처리 메커니즘:
[root@localhost mnt]# vim test
[root@localhost mnt]# cat test
this is a file
[root@localhost mnt]# awk '{print $0}' test
this is a file
[root@localhost mnt]# awk '{print $1}' test
this
[root@localhost mnt]# awk '{print $2}' test
is
[root@localhost mnt]# awk '{print $3}' test
a
[root@localhost mnt]# awk '{print $4}' test
file
[root@localhost mnt]# awk -F ":" '{print $1,$3}' /etc/passwd ## : , 1
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
2. awk 상용 변수
[root@localhost mnt]# awk '{print FILENAME,NR}' /etc/passwd ##
/etc/passwd 1
/etc/passwd 2
/etc/passwd 3
/etc/passwd 4
/etc/passwd 5
/etc/passwd 6
/etc/passwd 7
/etc/passwd 8
/etc/passwd 9
/etc/passwd 10
/etc/passwd 11
/etc/passwd 12
/etc/passwd 13
[root@localhost mnt]# awk -F: '{print NR,NF}' /etc/passwd ## : ,
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7
10 7
11 7
12 7
[root@localhost mnt]# awk -F: '/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
student:x:1000:1000:Student User:/home/student:/bin/bash
[root@localhost mnt]# awk -F: 'NR==3 {print}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost mnt]# awk -F: 'NR % 2 ==0 {print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
[root@localhost mnt]# awk -F: 'NR >=3 && NR<=5 {print}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost mnt]# awk -F: '$3 >=0 && $3 <=2 {print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
3. awk 의 BEGIN 과 END 용법
[root@localhost mnt]# awk -F: 'BEGIN{print "REDHAT"} {print NR;print } END {print "WESTOS"}' passwd ## REDHAT, WESTOS,
REDHAT
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
...
39
tcpdump:x:72:72::/:/sbin/nologin
40
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
WESTOS
[root@localhost mnt]#
[root@localhost mnt]# cat linux.txt
123
123 12
12
12 12 123
[root@localhost mnt]# awk 'BEGIN{i=0}{i+=NF}END{print i}' linux.txt ##
7
[root@localhost mnt]#
4. awk 의 고급 응용 프로그램 (if, for, while)
1) if 단일 분기 문
[root@localhost mnt]# awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}' /etc/passwd ## shell bash
2
2) if 두 갈래 문장
[root@localhost mnt]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd ## uid 500 500
31 9
3) 순환 을 위 한
[root@localhost mnt]# awk 'BEGIN{for(i=1;i<=5;i++){print i}}' ## 1 5
1
2
3
4
5
4) while 순환
[root@localhost mnt]# awk 'i=1 {} BEGIN {while (i<3) {i++;print i}}' test.sh ## 1 3 ,
1
2
3
[root@localhost mnt]#
[root@localhost mnt]# awk 'BEGIN {do {++i;print i} while (i<3)}' test.sh
1
2
3
연습:
[root@localhost mnt]# cat qiantao.sh
#!/bin/bash
for((a=1;a<=3;a++))
do
echo "Starting outside loop: $a"
for((b=1;b<=3;b++))
do
echo "Inside loop: $b"
done
done
[root@localhost mnt]# sh qiantao.sh
Starting outside loop: 1
Inside loop: 1
Inside loop: 2
Inside loop: 3
Starting outside loop: 2
Inside loop: 1
Inside loop: 2
Inside loop: 3
Starting outside loop: 3
Inside loop: 1
Inside loop: 2
Inside loop: 3
[root@localhost mnt]# vim 99.sh
[root@localhost mnt]# cat 99.sh
#!/bin/bash
## 9*9
#1*1=1
#2*1=2 2*2=4
#3*1=3 3*2=6 3*3=9
for i in $(seq 9)
do
for j in $(seq $i)
do
echo -ne "$i*$j=$(($i*$j))\t"
done
echo -e "
"
done
[root@localhost mnt]# sh 99.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
[root@localhost mnt]#
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
STL 학습노트(6) 함수 객체모방 함수는 모두pass-by-value이다 함수 대상은 값에 따라 전달되고 값에 따라 되돌아오기 때문에 함수 대상은 가능한 한 작아야 한다(대상 복사 비용이 크다) 함수 f와 대상 x, x 대상에서 f를 호출하면:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.