天天看點

關與 sed && awk 的一些操作小記

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