#!/bin/bash
:<<eof
1. 语法
grep [options] [pattern] [file1,file2...]
command | grep grep [options] [pattern]
options
-v 显示不符合pattern的内容
-i 忽略大小写
-n 显示行号
-r 递归搜索
-E 支持扩展正则表达式
-F 不按正则表达式匹配,按照字符串字面意思匹配
-c 只显示匹配行总数
-w 匹配整词
-x 匹配整行
-l 只显示文件名,不显示内容
-s 不显示错误信息
eof
set -e
set -x
set +x
#!/bin/bash
:<<eof
sed 流编辑器 对标准输出或文件逐行进行处理,如果匹配的上,则进行操作(删除修改)
1. 使用形式
a. stdout | sed [option] "/pattern/command"
b. sed [option] "/pattern/command" file
2. sed的选项
-n 只打印模式匹配行
-e 直接在命令行进行sed编辑,默认选项
-f 编辑动作保存在文件中,指定文件执行
-r 支持扩展正则表达式
-i 直接修改文件内容
3. sed的pattern
10command 匹配到第10行
10,20command 匹配从第10行开始,到第20行结束
10,+5command 匹配从第10行开始,到第16行结束
/pattern1/command 匹配到pattern1的行(常用)
/pattern1/,/pattern2/command 匹配到pattern1的行开始,到匹配到pattern2的行结束(常用)
10,/pattern1/command 匹配从10行开始,到匹配到pattern1的行结束
/pattern1/,10command 匹配从pattern1行开始,到匹配到10的行结束(常用)
4. sed command
查询
p 打印
增加
a 行后追加
i 行前追加
r 外部文件读入,行后追加
w 匹配行写入外部文件
删除
d 删除
修改
s/old/new 将行内第一个old替换为new
s/old/new/g 将行内全部的ld替换为new(常用)
s/old/new/2g 将行内前2个old替换为new
s/old/new/ig 将行内old全部替换为new,忽略大小写
显示行号
/pattern/= 显示行号
5. 反向引用
sed -i 's/pattern/&s/g' file
& 表示行中匹配的内容
\1 表示行中匹配的内容,但是pattern需要使用小括号括起来
案例
sed -r 's/:/&?/g' passwd
sed -r 's/\(:\)/\1?/g' passwd
passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:102:105::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:103:106:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
syslog:x:104:111::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
uuidd:x:106:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:107:113::/nonexistent:/usr/sbin/nologin
fanlihao:x:1000:1000:,,,:/home/fanlihao:/bin/bash
fanlihao:x:1000:1000:,,,:/home/fanlihao:/bin/bash
sshd:x:108:65534::/run/sshd:/usr/sbin/nologin
passwd.sed
/fanlihao/p
/root/p
eof
set -e
set -x
sed -n -e '/fanlihao/p' -e '/root/p' passwd
sed -n -f passwd.sed passwd
sed -n -r '/fanlihao|root/p' passwd
sed -rn '/^_[a-zA-Z]+/p' passwd
sed -r 's/:/&?/g' passwd
set +x
#!/bin/bash
:<<eof
1. 介绍
awk 文本处理工具,通常用于处理数据并生成结果报告
2. 基本形式
awk 'BEGIN{}pattern{commands}END{}' file
stdout | awk 'BEGIN{}pattern{commands}END{}' file
BEGIN{} 在处理数据之前会做的预执行的动作
pattern 匹配模式
{commands} 处理命令,可能多行
END{} 在处理所有匹配数据之后会做的预执行的动作
3. 内置变量(引用的时候不需要加上$)
$0 整行内容
$1-$n 当前行的第1-n个字段
NF 当前行的字段个数,也就是列数(number field)
NR 当前行的行号,从1开始(number row)
FNR 多文件处理时候,每个文件行号单独计数,都是从0开始(file number row)
FS 输入字段分隔符。不指定默认以空格或tab键分割(field separator)
OFS 输出字段分隔符。默认空格(output field separator)
RS 输入行分隔符。默认回车换行(row separator)[当前行中指定字符为换行]
ORS 输出行分隔符,默认回车换行
FILENAME 当前输入的文件名字
ARGC 命令行参数个数
ARGV 命令行参数数组
4. pattern
- 正则表达式
awk 'BEGIN{}/pattern/{commands}END{}' file
- 逻辑关系
awk 'BEGIN{}$3>90{commands}END{}' file
awk "BEGIN{printf "%-8s%-8s%-8s%-8s%-8s","Name","Chinese","Math","English","Average"}{total=$2+$3+$4;AVG=total/4;printf "%-8s%-8d%-8d%-8d%-8.2f",$1,$2,$3,$4,AVG}" student.txt
>
<
>=
<=
==
!=
~ 匹配正则表达式 $n~/pattern/
!~ 不匹配正则表达式 $n!~/pattern/
|| 逻辑或 condition1 || condition2
&& 逻辑与 condition1 && condition2
! 逻辑非 !condition1
5. commands - if-for
awk '{if(){}eles if(){}else{}}'
awk '{do{}while()}'
awk '{while(){}}'
awk '{for(;;){}}'
6. 字符串函数
length(str) 返回字符串长度 整数长度值
index(str1,str2) 在str1查找str2的位置 返回值为位置索引,从1计数
tolower(str) 转为小写
toupper(str) 转为大写
substr(str,m,n) 从str的m个字符开始,截取n位,n若不指定,则默认为长度 截取后的子串
sub(RE,RepStr,str) 替换查找到的第一个子串
gsub(RE,RepStr,str) 替换查找到的所有子串
split(str,arr,fs) 按fs切割字符串,结果保存arr 切割后的子串的个数
match(str,RE) 在str中按照RE查找,返回位置 返回索引位置
7. 参数
-v 参数传递
-V 查看awk的版本号
-f 指定脚本文件
-F 指定分隔符
-f test.awk
awk -v
awk -f test.awk file
test.awk
BEGIN{
}
{
}
END{
}
8. shell中数组用法
array=('a','b','c','d','d')
打印元素 echo ${array[2]}
打印元素个数 echo ${#array[@]}
打印元素长度 echo ${#array[1]}
元素赋值 array[2]='zz'
删除元素 unset array;unset array[2]
分片访问 echo ${array[@]:1:3}
元素内容替换 ${array[@]//1/3}
数组遍历
for item in array
do
echo $item
done
9. awk中使用shell变量两种方式
① awk -v variable1="$shell_variable" '{print shell_variable}'
② awk '{print /$shell_variable/,$1}' file
eof
set +x
awk 'BEGIN{FS=":";OFS="|"}{print $1,$3}' passwd
10. awk中使用shell命令
- system("cmd")
- print cmd | "/bin/bash"
awk 'BEGIN{print "echo","abc"| "/bin/bash"}'