美文网首页
Linux 命令合集(八):sed 和 awk

Linux 命令合集(八):sed 和 awk

作者: w也不知道 | 来源:发表于2017-12-11 16:50 被阅读0次

一:行编辑器 sed

  1. 常用选项
-n:只打印模式匹配的行
-r:支持正则表达式
-e:在命令行模式上进行命令编辑
-i:直接对源文件进行编辑

例一:只打印指定行

sed -n '1p' /etc/passwd #只打印第一行
sed -n '1,5p' /etc/passwd #打印第一行到第五行
sed -n '5,$p' /etc/passwd #打印第五行到最后一行
sed -n 'n;p' /etc/passwd #打印偶数行
sed -n 'p;n' /etc/passwd #打印奇数行
sed -n '1,4{=;p}' /etc/passwd #打印第一到第五行,并打印行号
sed -n '1,4!{=;p}' /etc/passwd #不打印第一行到第五行

例二:打印匹配指定字符的行(支持正则表达式)

sed -n -r '/ro{1,2}/p' /etc/passwd
sed -n '/^#/!{/^$/!p}' /etc/my.cnf #不显示注释行和空行
sed -e '/^#/d' -e '/^$/d' /etc/my.cnf

例三:文件内容的添加

sed  '/root/s/^/hello /' test.txt #匹配行的行首添加文字
sed  '/root/s/$/ hello/' test.txt #匹配行的行位添加文字
sed 's/root/& houmian/' test.txt # &代表匹配到的内容,本例子是在被匹配到的单词后面添加内容
sed '/root/i \ni hao\nwo hen hao' file #在匹配内容的前面添加两行内容
sed '/root/a \ni hao\nwo hen hao' file #在匹配内容的后面添加两行内容
sed '/root/c \ni hao\nwo hen hao' file #将匹配内容行替换为后面的内容
前面添加内容
后面添加内容
替换原有内容
使用变量

二、列编辑器awk

1、 内建变量

FS  :输入分隔符;默认空白字符
OFS :输出分隔符;默认空白字符
RS  :输入换行符
ORS :输出换行符                  
NF  :每行的字段数
$NF :输出每行的最后一个字段
$NF-1:输出倒数第二个字段
NR  :输出行号,可接多个文件
FNR :对每个文件分别记行数
FILENAME:文件名
ARGC:命令行参数的个数
ARGV:命令行所给定的各个参数

$awk 'BEGIN {print ARGV[1]}' /etc/fstab 
    /etc/fstab

$awk 'BEGIN {print ARGV[0]}' /etc/fstab 
    awk

2、 自定义变量

$awk -v test='Hello awk!' 'BEGIN {print test}'
    Hello awk!

$awk 'BEGIN {test="HEllo awk!";pirnt test}'
    Hello awk!

3、printf 的格式

(1) 格式必须给出
(2) 不会自动换行,需要显式给出换行控制符,\n
    
格式符:
    %c:显式字符的ASCII码
    %d,%i:显示十进制整数
    %e,%E:科学计数法数值显示
    %f:显示浮点数
    %g,%G:一科学技术发或浮点形式显示数值
    %s:显示字符串
    %u:无符号整数
    %%:显示%自身

格式化输出:
    左对齐:
        $awk -F: '{printf "Username: %-10sUID:%d\n",$1,$3}' /etc/passwd
            Username: root      UID:0
            Username: bin       UID:1
    右对齐:
        $awk -F: '{printf "Username: %10s UID:%d\n",$1,$3}' /etc/passwd
            Username:       root UID:0
            Username:        bin UID:1

4、三目运算符

条件?True-动作:False-动作
    $awk -F: '{$3>=500?type="ComUser":type="Sysuser";printf "%10-s:%-s\n",$1,type}' /etc/passwd
        root      :Sysuser
        bin       :Sysuser
        daemon    :Sysuser
        adm       :Sysuser
        user1     :ComUser
        user2     :ComUser
        user3     :ComUser
        apache    :Sysuser

5、模式匹配

若$NF包含"bash",打印第一列和最后一列
$awk -F: '$NF~/bash/{print $1,$NF}' /etc/passwd
    root /bin/bash
    liu /bin/bash

6、流程控制

if-else用法:
    $awk -F: '{if($3>=500) {printf "Common user\t:%s\n",$1} else {printf "Root or sysuser\t:%s\n",$1}}' /etc/passwd
        Root or sysuser :rpc
        Root or sysuser :rpcuser
        Common user         :nfsnobody

while用法:(打印每个元素的长度)
    $awk '{i=1;while(i<=NF) {printf "%34-s:%d\n", $i,length($i);i++}}' /etc/grub.conf 
        kernel                            :6
        /vmlinuz-2.6.32-431.el6.x86_64    :30
        ro                                :2
        root=/dev/mapper/VolGroup-lv_root :33
        rd_NO_LUKS                        :10
        LANG=en_US.UTF-8                  :16
        rd_NO_MD                          :8
        rd_LVM_LV=VolGroup/lv_swap        :26
        SYSFONT=latarcyrheb-sun16         :25
        crashkernel=auto                  :16
        rd_LVM_LV=VolGroup/lv_root        :26
        KEYBOARDTYPE=pc                   :15
        KEYTABLE=us                       :11
        rd_NO_DM                          :8
        rhgb                              :4
        quiet                             :5

for 的用法
统计同一IP出现的次数:
    $awk '{count[$1]++}END{for(i in count) {print count[i]"\t"i}}' /var/log/httpd/access_log  
        172.16.1.1  10
        172.16.1.3  2
        172.16.1.4  1

打印相同字母的数字和
    $cat xx.log
        a  1
        b  3
        c  2
        d  7
        b  5
        a  3 
        g  2
        f  6
        d  9
    $awk '{count[$1]+=$2}END{for(i in count) print i,count[i]}' xx.log
        a 4
        b 8
        c 2
        d 16
        f 6
        g 2

7、算某一列数字的和

$awk -F: '{sum=sum+$3}END{printf "sum = %d\n",sum}' /etc/passwd
    sum = 67564

相关文章

网友评论

      本文标题:Linux 命令合集(八):sed 和 awk

      本文链接:https://www.haomeiwen.com/subject/ieqiixtx.html