一:行编辑器 sed
- 常用选项
-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
网友评论