Sed && Awk
Sed:
& 添加空格
[[email protected] ~]# echo 123456789
123456789
[[email protected] ~]# echo 123456789 | sed 's/./ &/g'
1 2 3 4 5 6 7 8 9
[[email protected] ~]# echo 123456789 | sed 's/./ &/2g'
1 2 3 4 5 6 7 8 9
## 我們看到 /g 全局替換的時候 , 1 的前面也有了空格 , 這顯然不是我們想要的 , 是以從第二個字段開始替換 /2g
Awk:
& awk 列求和(統計目标目錄中所有 .gz 包的總大小)
[[email protected] src]# ll -k *.gz ## 可以看到所有 .gz 包大小以 k 為機關列出
-rw-r--r--. 1 root root 6725 5月 7 2013 apache-tomcat-6.0.37.tar.gz
-rw-r--r--. 1 root root 960 5月 2 2013 apr-1.4.6.tar.gz
-rw-r--r--. 1 root root 848 5月 2 2013 apr-util-1.5.2.tar.gz
-rw-r--r--. 1 root root 5994 5月 2 2013 httpd-2.4.3.tar.gz
-rw-r--r--. 1 root root 729 3月 29 2013 nginx-1.3.12.tar.gz
-rw-r--r--. 1 root root 1597 5月 2 2013 pcre-8.30.tar.gz
-rw-r--r--. 1 root root 417 4月 16 09:51 ZendGuardLoader-70429-PHP-5.4-linux-glibc23-x86_64.tar.gz
-rw-r--r--. 1 root root 548 9月 9 15:14 zlib-1.2.7.tar.gz
[[email protected] src]# ll -k *.gz | awk 'BEGIN{total=0}{total+=$5}END{print total}'
17818
## 執行指令前定義 total 為 0 ,操作第一行時 total = 0 + $5( $5 為 6725),第二行時 total = 6725 + $5( $5 為 960),一直到加完,最後 print total(總大小,以 k 為機關)
操作文本:
[[email protected] tmp]# sed '1,$p' example
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
ftp1:x:500:500::/home/ftp1:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
1、列印以 root 開頭的行
[[email protected] tmp]# sed -n '/^root/p' example
root:x:0:0:root:/root:/bin/bash
2、列印檔案最後一行
[[email protected] tmp]# sed -n '$p' example
apache:x:48:48:Apache:/var/www:/sbin/nologin
3、給以 root 開頭的行首添加字元串 abc 并顯示該行
[[email protected] tmp]# sed -n 's/^root/abc&/p' example
abcroot:x:0:0:root:/root:/bin/bash
4、為檔案所有行首添加字元串 abc
[[email protected] tmp]# sed 's/^/abc&/' example
abcroot:x:0:0:root:/root:/bin/bash
abcbin:x:1:1:bin:/bin:/sbin/nologin
abcadm:x:3:4:adm:/var/adm:/sbin/nologin
abclp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
abcsync:x:5:0:sync:/sbin:/bin/sync
abcftp1:x:500:500::/home/ftp1:/bin/bash
abcapache:x:48:48:Apache:/var/www:/sbin/nologin
5、給檔案所有行後追加字元串 abc
[[email protected] tmp]# sed 's/$/&abc/' example
root:x:0:0:root:/root:/bin/bashabc
bin:x:1:1:bin:/bin:/sbin/nologinabc
adm:x:3:4:adm:/var/adm:/sbin/nologinabc
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologinabc
sync:x:5:0:sync:/sbin:/bin/syncabc
ftp1:x:500:500::/home/ftp1:/bin/bashabc
apache:x:48:48:Apache:/var/www:/sbin/nologinabc
6、給檔案最後一行後添加一行字元串 welcome to my sed .
[[email protected] tmp]# sed '$a\welcome to my sed .' example
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
ftp1:x:500:500::/home/ftp1:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
welcome to my sed .
7、将檔案中的小寫母全部替換為大寫
[[email protected] tmp]# sed 's/[a-z]/\U&/g' example
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
FTP1:X:500:500::/HOME/FTP1:/BIN/BASH
APACHE:X:48:48:APACHE:/VAR/WWW:/SBIN/NOLOGIN
8、隻将檔案每行首字母小寫替換為大寫
[[email protected] tmp]# sed 's/[a-z]/\U&/' example
Root:x:0:0:root:/root:/bin/bash
Bin:x:1:1:bin:/bin:/sbin/nologin
Adm:x:3:4:adm:/var/adm:/sbin/nologin
Lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Sync:x:5:0:sync:/sbin:/bin/sync
Ftp1:x:500:500::/home/ftp1:/bin/bash
Apache:x:48:48:Apache:/var/www:/sbin/nologin
9、将一個空格替換為32個逗号或者更多個 (呃,這是在群裡看到他們讨論的,這需求......)
[[email protected] tmp]# echo a bc | sed "s/ /`echo $(seq 1 32)`/" | sed 's/[0-9]\+/,/g'
a, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,bc
10、接上面的,在第20個逗号後面加個單引号
[[email protected] tmp]# echo a bc | sed "s/ /`echo $(seq 1 32)`/" | sed 's/[0-9]\+/,/g' | sed "s/,/,'/20"
a, , , , , , , , , , , , , , , , , , , ,' , , , , , , , , , , , ,bc
# sed "/s/,/,'/20" 這個 20 代表比對第 20 個逗号,用雙引号是為了差別要替換的單引号
11、将文本中第一個空行替換為 test
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc
[[email protected] tmp]# sed -i '1,/^$/s/^$/test/' a.txt
aaaaaaaaaaaaaaaaaaa
test
bbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccc
12、替換檔案中IP位址
ifconfig eth0 192.168.0.1
[[email protected] tmp]# sed -ri 's/(([0-9]{1,3}\.?){4})/192.168.0.10/' a.txt
[[email protected] tmp]# cat a.txt
ifconfig eth0 192.168.0.10
13、給字元串中插入空格
[[email protected] tmp]# echo "abcd" | sed 's/./& /g'
a b c d
Awk
1、列印 rpm -qa 清單的所有軟體包名,不列印版本号
[[email protected] tmp]# rpm -qa | awk -F - 'NF-=2,OFS="-"'
policycoreutils
setup
iproute
xml-common
util-linux-ng
iso-codes
udev
dmz-cursor-themes
device-mapper
ca-certificates
device-mapper-event
tzdata
libdrm
nss-softokn-freebl
.........
[[email protected] tmp]# rpm -qa | awk -F "-[0-9]" '{print $1}'
policycoreutils
setup
iproute
xml-common
util-linux-ng
iso-codes
udev
dmz-cursor-themes
device-mapper
ca-certificates
device-mapper-event
tzdata
libdrm
nss-softokn-freebl
.........
1、删除比對行
sed '/abc/d' filename
2、删除比對行後指定5行
sed '/abc/,+5d' filename
3、删除比對行後所有行
sed '/abc/,&d' filename