shell编程代码模板-进阶版-三剑客

#!/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
# -e 指定多个匹配项
sed -n -e '/fanlihao/p' -e '/root/p' passwd
# -f 指定文件,其中包含每条sed的 "/pattern/command"
sed -n -f passwd.sed passwd
# -r 开启扩展正则表达式
sed -n -r '/fanlihao|root/p'  passwd



sed -rn '/^_[a-zA-Z]+/p' passwd
# _apt:x:105:65534::/nonexistent:/usr/sbin/nologin
# 给每个: 后面添加一个?
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"}'
  • 18
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卫生纸不够用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值