grep
pgrep
pgrep,可以迅速定位包含某个关键字的进程的pid;使用这个命令,再也不用ps aux 以后去对哪个进程的pid了
# pgrep -l etcd
2840 etcd
sed
在每行的头添加字符,比如"HEAD",命令如下:
sed 's/^/HEAD&/g' test.file
在每行的行尾添加字符,比如“TAIL”,命令如下:
sed 's/$/&TAIL/g' test.file
打印第一行到第三行
sed -n '1,3p' file1
行替换
sed -i '/xxx/s/aaa/fff/g' file --表示针对文件,找出包含xxx的行,并将其中的aaa替换为fff
sed '/ids1.deliver.com/s/ids1.deliver.com/local.ids1.deliver.com/' iis.conf
#ids1.deliver.com 后面插入一行
sed -i '/ids1.deliver.com/a\ \ \ \ \ \ \ \ include proxy.conf;' /usr/local/openresty/nginx/conf/conf.d/iis.conf
sed -i '/daemonize/a slaveof 10.80.130.171 6379' 6379.conf
#匹配行之后替换
sed -i '/discovery.zen.ping.unicast.hosts/ c discovery.zen.ping.unicast.hosts: ["10.90.2.240", "10.90.2.241","10.90.2.242","10.80.81.150","10.80.82.150","10.80.83.150"]' elasticsearch.yml
sed 中有变量,使用双引号
host=`hostname`
hang=`cat /etc/hosts | grep -n $host | awk -F: '{print $1}'| sed -n '2p'`
echo $hang
sed -i "${hang}d" /etc/hosts
AWK
参数
NR 行数
NF 每行数据字段的个数(以空行为分隔符)
FNR 数据文件的当前记录号
FS 输入分隔符 OFS 输出分隔符
RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效 awk -v RS=" " '{print }' /etc/passwd 表示以空格为换行符
ORS:输出记录分隔符,输出时用指定符号代替换行符 awk -v RS=" " -v ORS='###' '{print }' /etc/passwd 相当于把换行符的空格替换成###
选项:-F 指明输入时用到的字段分隔符 -v var=value: 自定义变量
print输出指定内容后换行,printf只输出指定内容后不换行
多个分隔符
tail -n3 /etc/services |awk -F'[/#]' '{print $3}'
变量
awk -v a=123 'BEGIN{print a}'
# 或使用单引号
a=1234
awk 'BEGIN{print '$a'}'
正则匹配
tail /etc/services |awk '/tcp/ {print $0}'
tail /etc/services |awk '/^tcp/ {print $0}'
tail /etc/services |awk '/blp5/ && /tcp/ {print $0}'
#不匹配开头是#和空行
awk ' ! /^#/ && ! /^$/{print $0}' /etc/hosts
awk ' ! /^#|^$/' /etc/hosts
awk '/^[^#]|"^$"/' /etc/hosts
RS和ORS
RS 输入记录分隔符,默认是换行符\n
ORS 输出记录分隔符,默认是换行符\n
# echo "www.baidu.com/user/test.html" |awk 'BEGIN{RS="/"}{print $0}'
www.baidu.com
user
test.html
seq 10 |awk 'BEGIN{ORS="+"}{print $0}'
1+2+3+4+5+6+7+8+9+10+
ARGC ARGV
ARGC是命令行参数数量
ARGV是将命令行参数存到数组,元素由ARGC指定,数组下标从0开始
# awk 'BEGIN{print ARGC}' 1 2 3
4
# awk 'BEGIN{print ARGV[0]}'
awk
# awk 'BEGIN{print ARGV[1]}' 1 2
1
# awk 'BEGIN{print ARGV[2]}' 1 2
2
空行
cat file | awk '{if($0~/^$/)print NR}' #空行所在的行数 grep -n ^$ file | awk -F : '{print $1}'
数组
awk '{a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access_log
# 说明:a[$1]++ 创建数组a,以第一列作为下标,使用运算符++作为数组元素,元素初始值为0。处理一个IP时,下标是IP,元素加1,处理第二个IP时,下标是IP,元素加1,如果这个IP已经存在,则元素再加1,也就是这个IP出现了两次,元素结果是2,以此类推。因此可以实现去重,统计出现次数
[root@block1 test]# cat file
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@block1 test]# awk -F "/+" '{hotel[$2]++}END{for(pol in hotel)print pol,hotel[pol]}' file | sort -rnk2|column -t
www.etiantian.org 3
post.etiantian.org 2
mp3.etiantian.org 1
netstat -tunlp | awk '/^udp/ {S[$NF]++} END {for (a in S) print a,S[a]}'
others
kubectl get pod --all-namespaces | awk '{if($5 > 5){print $0}}'