shell-Linux三剑客

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
      • 打印
  • 新增
    • a
      • 在匹配行后新增
    • i
      • 在匹配行前新增
    • r
      • 外部文件读入,行后新增
    • w
      • 匹配行写入外部文件
  • 删除
    • d
  • 替换
    • s/old/new/
      • 只修改匹配行中第一个old
    • s/old/new/g
      • 修改匹配行中所有的old
    • s/old/new/ig
      • 忽略大小写
# 只在内存修改,未真正生效
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

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占用率
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359