shell piping管道
shell输入输出
- read 用来读取输入,并赋值给变量
- echo,printf 可以简单输出变量
- > file 输入重定向到另一个文件
- >> 表示追加,等价于tee -a
- < file 输入从定向
- | 表示管道,也就是前一个命令的输出传入下一个命令的输入
文件描述符
输入文件---标准输入0
输出文件---标准输出1
错误输出文件---标准错误2
使用2>&1 >/tep/tmp </tmp/tmp 表示
ls ddd >/tmp/1 2>&1 #标准输出和标准错误都转到/tmp/1中,顺序不变
管道
把不同程序的输入和输出链接
可以连接更多命令
-常见的组合命令Linux三剑客echo hell world | read x;echo $x
echo hello world | while read x;do echo $x; done
hello world
Linux三剑客
- grep:基于正则表达式查找满足条件的行
- awk:根据定位到的数据行处理其中的分段
- sed:根据定位到的数据行修改数据
Linux三剑客的价值
- grep 数据查找定位
- awk 数据切片
- sed 数据修改
类比sql: - grep=select * from table
- awk=select field from table
- sed=update table set field=new where field=old
grep:处理匹配的一行
- grep pattern(参数) file
- grep -i pattern file 忽略大小写
- grep -v pattern file 不显示匹配的行
- grep -o pattern file 把每个匹配的内容用独立的行显示
- grep -E pattern file 使用扩展正则表达式
- grep -A -B -C pattern file 打印命中数据的上下文
- grep pattern -r dir/ 递归搜索
符号 | 含义 |
---|---|
-i | 忽略大小写 |
-c | 只输出匹配行的数量 |
-n | 显示行号 |
-r | 递归搜索:目录下搜索 |
-E | 支持拓展正则表达式 |
-w | 匹配整个单词 |
-l | 只列出匹配的文件名 |
-F | 不支持正则,按字符串字面意思进行匹配 |
grep 123 #给输入,从标准输入里读取匹配的内容
ps -ef | grep Chrome #提取出Chrome的进程,还会将grep本身提取出来
cat /tmp/1 | grep xx #提取出1文件中的xx
pattern正则表达式
基本表达式:
- ^ 开头,$结尾
- [a-z] [0-9] 区间
- \ * 0个或多个
基本正则与扩展正则的区别:
- ? 非贪婪匹配,尽量匹配少的,一般和*一起,此时一般会匹配0个
- + 一个或者多个
- ()分组
- {} 范围约束
- | 匹配多个表达式中的任意一个
- . 表示任意字符
- * 贪婪匹配,0个或多个,尽量匹配多的
ps -ef | grep "^ *0.*seven"
echo hello world | grep -E "hello|hi" #匹配hello或hi
echo 1234 | grep . #1234
echo 1234 | grep -o . #
1
2
3
4
echo 1234 | grep -o ..
12
34
echo 1234 | grep -o ...
123
echo 1234 | grep -o '.*' #匹配所有的
1234
echo 1234 | grep -oE '.*?' #尽量匹配少的,一般和*一起,此时一般会匹配0个
1
2
3
4
curl 模拟网站浏览,执行后打印网页的源代码
curl http://teaterhome.com | grep '^ *<a title=".*".*topics' | grep -o '".*"'
pattern模式
匹配模式 | 含义 |
---|---|
5 | 只处理第5行 |
5,10 | 只处理第5行到第10行 |
/pattern1/ | 只处理能匹配pattern1的行 |
/pattern1/,/pattern2/ | 只处理从匹配pattern1的行到匹配pattern2的行 |
awk:处理匹配的一列
- 文本处理工具,处理数据并生成结果报告
- 两种形式
- awk 'BEGIN{} pattern {commands} END{}' file
- some command |awk 'BEGIN{} pattern {commands} END{}'
- awk 理论上可以代替grep
- awk 'pattern{action}'
- awk 'BEGIN{}END{}' 开始和结束
- awk '/running/' 正则匹配
- awk '$2~/xxx/' 字段匹配
- awk 'NR==2' 取第二行
- awk 'NR>1' 去第一行
格式 | 含义 |
---|---|
BEGIN{} | 处理数据之前执行,只执行一次 |
pattern | 匹配模式 |
{commands} | 处理的命令 |
END{} | 处理数据之后执行,只执行一次 |
内置变量
内置变量 | 含义 |
---|---|
$0 | 整行内容 |
$1-$n | 当前行的第1-n个字段 |
NF (Number Field) | 当前行字段数 |
NR (Number Row) | 当前行行号,从1开始 |
FS(Field Separator) | 输入字段分割符,默认为空格或tab键 |
RS(Row Separator) | 输入行分割符,默认为回车符 |
OFS(Output Field Separator) | 输出字段分割符,默认为空格 |
ORS(Output Row Separator) | 输出行分割符,默认为回车符 |
awk 'BEGIN{print 1*10*2} #开始的时候执行print 1*10*2 ,20
curl http://teaterhome.com | awk '^ *<a title=".*".*topics #既awk '/running/'
ps | awk 'NR>1{print $1}'
awk的字段数据处理
- -F 参数指定字段分隔符
- BEGIN{FS="_"} 也可以表示分隔符
- $0 代表当前的记录
- $1 代表第一个字段
- $N 代表第N个字段
- $NF 代表最后一个字段
echo '1,2,3
4,5,6
7,8,9' | awk -F '{print $2}'
2
5
8
curl http://teaterhome.com | grep '^ *<a title=".*".*topics' | awk -F '"' '{print $1}' # 指定“为分割符
# 打印文件第一行的第二列
awk -F: 'NR == 1 {print $2}' /etc/passwd
# 打印文件第3到5行的第1列
awk -F: 'NR >=3 && NR <= 5 {print $1}' /etc/passwd
awk -F: 'NR==3,NR==5 {print $1}' /etc/passwd
# 打印文件的第一列和最后一列
awk -F: '{print $1,$NF}' /etc/passwd
awk -F: '{printf "%-20s %-20s\n", $1,$NF}' /etc/passwd
awk -F: 'BEGIN{{printf "%-20s %-20s\n", "username","console"} {printf "%-20s %-20s\n", $1,$NF} END{printf "%-20s\n", "20"}' /etc/passwd
awk内置变量
- FS 字段分隔符
- OFS 输出数据的字段分隔符
- RS 记录分隔符,行的分隔符
- ORS 输出字段的行分隔符
- NF 字段数
- NR 记录数,第几行数
echo '1,2,3
4,5,6
7,8,9' | awk -F 'BEGIN{OFS="|"}{print NF,NR,$1$2}' #输出内容以 | 隔开
3|1|1|2
3|2|4|5
3|3|7|8
awk字段分割
把单行拆分为多行
echo $PATH | awk 'BEGIN{RS=":"}{print $1}' #用:分隔的内容被分成了一行行的
多行组合为单行
echo $PATH | awk 'BEGIN{RS=":"}{print $1}' | awk 'BEGIN{ORS=":"}{print $0}'
sed
- sed[addr]X[option]
- 流编辑器,对文件逐行进行处理
- -e 表达式
- sed -n '2p' 打印第二行
- sed 's#hello#world#' 修改 s+特殊符号
- -i 直接修改源文件
- -E 扩展表达式
- -debug 调试
选项 | 含义 |
---|---|
-n | 只打印模式匹配的行 |
-f | 加载存放动作的文件 |
-r | 支持拓展正则 |
-i | 直接修改文件 |
echo 1,2,3 | sed "s#,2#,20#" #1,20,3
echo 1,2,3 | sed "s#,#|#" #1|2,3 只替换第一个
echo 1,2,3 | sed "s#,#|#g" #1|2|3 全局替换
echo $PATH | awk 'BEGIN{RS=":"}{print $o}' | sed -E 's#/[^/]*$#xxx#'
sed -n '1p' /etc/passwd # 文件下第一行文件打印出来
cat /etc/passwd | sed -n '1p'
# 文件第5行到第8行打印出来
sed -n '5,8 p' /etc/passwd
sed -n '/root/ p' /etc/passwd #//中间输入关键字(正则),关键字过滤
sed -n '/^m/ p' /etc/passwd
sed -n '/\/usr\/sbin\.noligin/ p' /etc/passwd
curl https://testing-studio.com/ | grep -o "http[s]*://[^ '\"]*" #[^ '\"]匹配非空格非单引号非双引号
curl -s https://testing-studio.com/ | grep -o "http[s]*://[^ '\"]*" | sed 's#[^%][0-9][0-9]*#x#g' | sort | uniq #提取所有链接,去掉链接中的数字,给出不带数字的链接
command命令
- 查询
- p
- 打印
- p
- 新增
- a
- 在匹配行后新增
- i
- 在匹配行前新增
- r
- 外部文件读入,行后新增
- w
- 匹配行写入外部文件
- a
- 删除
- d
- 替换
- s/old/new/
- 只修改匹配行中第一个old
- s/old/new/g
- 修改匹配行中所有的old
- s/old/new/ig
- 忽略大小写
- s/old/new/
# 只在内存修改,未真正生效
sed '/man/ a 这是新增的内容' passwd_bk
# 真正修改文件内容
sed -i '/man/ a 这是新增的内容' passwd_bk
# 将文件内容添加到另一文件内
echo -e "这是文件中的内容\n这是第二行" > test.txt
sed -i '/bash/ r test.txt' passwd_bk #passwd_bk文件中bash后新增了test文件内容
sed -i '/^Port/ w ssh_port.txt' sshd_config
sed -i '/^#|^$ d' sshd_config # ^$表示空格,删除文件中#开头或空格的行
sed -i 's/bin/BIN/' passwd_bk # 将文件中第一个bin改为BIN
sed -i 's/bin/BIN/g' passwd_bk # 将文件中所有bin改为BIN
sed -i '3,9 s/bin/BIN/' passwd_bk # 将文件中第3行到第9行的第一个bin改为BIN
sed -i '3,9 s/bin/BIN/g' passwd_bk # 将文件中第3行到第9行的所有bin改为BIN
sed -i '/^bin/,/^news/ s/\/usr\/sbin\/nologin/\/bin\/bash' passwd_bk
sed -i '/^bin/,/^news/ s@/usr/sbin/nologin@/bin\/bash@' passwd_bk
sed -i '^Port/ c Port 2222' sshd_config. # 将Port开头的这一行用Port 2222替换掉
命令分类
- 文件:everything is file
- 网络:特殊的文件
- 进程:文件的运行状态
- 硬件设备:硬件读写
文件
- 磁盘:df
- 目录:ls cd pwd $PWD
- 文件编辑:vi sed cat
- 文件信息:chmod chown
- 文件搜索:find grep
- 软链:ln -s
- socket: 进程通讯
- 管道:进程通讯 mkfifo
df #系统磁盘情况
which python #查找安装地址
ls -l #查看目录里文件的详细信息,包括读写可执行权限
网络
- netstat -tlnp
- netstat -tnp
- mac与linux不一致:netstat -p tcp -n -a
一键搭建web网站
- python2 -m CGIHTTPServer 8000
- python3 -m http.server -cgi 8000
curl http://www.baidu.com > baidu.html
python -m CGIHTTPServer 8000 #python2
CGI-Bin技术
/#!/bin/bash
echo "Content-type:text/html"
echo ""
curl http://www.baidu.com/s?$QUERY_STRING 2 > /dev/null
把代码放到cgi-bin目录下,增加可执行权限
使用apache或者python server运行
curl网络请求
- get
- post
- cookie
curl 'https://www.baidu.com/s?ie=utf-8&csq=1&pstg=20&mod=2&isbd=1&cqid=be79a2d2000bd26b&istc=1253&ver=RwxsJNIF0uXaje8t6aTWnu9W1b2-XSyREIO&chk=5d145c7f&isid=5576C7F06A468016&ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=%E9%9C%8D%E6%A0%BC%E6%B2%83%E5%85%B9&rsv_spt=1&oq=%25E9%259C%258D%25E6%25A0%25BC%25E6%25B2%2583%25E5%2585%25B9&rsv_pq=c9345894000bf61e&rsv_t=03068qO2Oe5%2B8PEHxyoqVY37VaygFfEaU3vwl6aOctwiwq6Ut1Ay89%2BzbWEEg2J7QgGh&rqlang=cn&rsv_enter=1&rsv_sug2=0&inputT=6&rsv_sug4=771&bs=%E9%9C%8D%E6%A0%BC%E6%B2%83%E5%85%B9&f4s=1&_ck=114737.0.-1.-1.-1.-1.-1&isnop=0&rsv_stat=-2&rsv_bp=1' -H 'Pragma: no-cache' -H 'is_xhr: 1' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'X-Requested-With: XMLHttpRequest' -H 'Cookie: BIDUPSID=3E130EB8478A957914219C891B4C5054; PSTM=1558943388; BD_UPN=123253; BAIDUID=5576C71D08E837055EF9BA1A51CF06A4:SL=0:NR=10:FG=1; BDUSS=0xnRnUwZEJaT1owUmNiRnpqV0RjVkhZMWl-SkRCOGxNVzEzZzYtTzJwdXNaUlJkSVFBQUFBJCQAAAAAAAAAAAEAAADcT942bWF5YmXO0tDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzY7Fys2OxcN; BDSFRCVID=fA_OJeCwM6NjGmjwWPvNwiq1Q_saVNoTH6aopoJpJLEVBjNequEyEG0PjU8g0KubkczkogKK0eOTHkCF_2uxOjjg8UtVJeC6EG0P3J; H_BDCLCKID_SF=tJAD_K8btC03qnPkh-rHh4It-eT22-usKant2hcH0KLKD-3n3-co5p-75MCfQjcrMDTZQpRVafb1MRjvWlnc54LpDN_qLxQbLnbL_l5TtUJqSDnTDMRh-4_iKaQyKMnitIT9-pno0hQrh459XP68bTkA5bjZKxtq3mkjbIOFfD_-hD-Rj6Aben8j-qOh2bjLHjb0XnTqaJ02hKtk-PnVePKFBPnZKxJfBRcwBq3E2t3RV-Q85PraDq_mKUQpWtRnWncKW-JOWtJk8h5KL46FbJ_0Qqr405OT2HIO0KJcbRoOHPcchPJvyT88XnO7aMJlXbrtXp7_2J0WStbKy4oTjxL1Db0eBjT2-DA__C8hJKJP; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; BD_CK_SAM=1; BD_HOME=1; MCITY=-163%3A; PSINO=5; sug=0; sugstore=0; ORIGIN=0; bdime=0; BDRCVFR[feWj1Vr5u3D]=mk3SLVN4HKm; H_PS_PSSID=1458_29425_21105_29135_29238_28518_29099_29131_28834_29221_26350_29440; COOKIE_SESSION=18_0_7_6_1_1_0_0_7_1_0_0_1561371270_0_0_0_1561371472_0_1561615478%7C9%2310093_6_1561019753%7C3; H_PS_645EC=0c6fYexC50rzC8ECD3Bvb5QLTuPdpudjUk5yBH7%2FXwxJgeN42aEMqDYH7pBACSZEFYqq' -H 'Connection: keep-alive' -H 'Referer: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=%E9%9C%8D%E6%A0%BC%E6%B2%83%E5%85%B9&rsv_spt=1&oq=%25E9%259C%258D%25E6%25A0%25BC%25E6%25B2%2583%25E5%2585%25B9&rsv_pq=c9345894000bf61e&rsv_t=03068qO2Oe5%2B8PEHxyoqVY37VaygFfEaU3vwl6aOctwiwq6Ut1Ay89%2BzbWEEg2J7QgGh&rqlang=cn&rsv_enter=1&rsv_sug2=0&inputT=6&rsv_sug4=771' -H 'is_referer: https://www.baidu.com/s?wd=%E9%9C%8D%E6%A0%BC%E6%B2%83%E5%85%B9&rsv_spt=1&rsv_iqid=0x86c8f64a0001fac4&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&oq=%25E9%259C%258D%25E6%25A0%25BC%25E6%25B2%2583%25E5%2585%25B9&rsv_t=19b5JEEmC%2F8ViT2A4zev2YDzB4JQ%2Bykibiklb%2FEnG2tUu2b%2BhWnBxRNgFvqltmWfCAaw&rsv_pq=d6a55b1700018532' --compressed
# network右击 copy as curl
curl --help
jq
- 需自行安装 https://stedolan.github.io/jq/manual/
- json 数据处理
- jq . | cat 管道处理
- jq '.. | .name?' 提取所有的name
- 将内容格式化
curl https://testerhome.com/api/v3/topics.json | -jq #json格式化
curl https://testerhome.com/api/v3/topics.json | jq . | grep title
性能统计:top 列cpu、mem情况
man top #查看top的帮助文档
top -d 1 -n 1 #一秒更新一次
top -p #指定系统的pid
for i in {1..20};do top -d 1 -n 1 -p | grep 20444 | awk '{print $9}' #cpu占用率