通常使用shell去运行脚本,两种方法 :
bash xxx.sh
bash -c "cmd string"
如果用bash -c 那么bash 会从第一个非选项参数后面的字符串中读取命令,如果字符串有多个空格,第一个空格前面的字符串是要执行的命令,也就是$0, 后面的是参数,即$1,$2….
-0, --null Items are separated by a null, not whitespace.
Disables quote and backslash processing
-a, --arg-file=FILE Read arguments from FILE, not standard input
-d, --delimiter=CHARACTER Input items are separated by CHARACTER, not by
blank space. Disables quote and backslash
processing
-E END If END occurs as a line of input, the rest of
the input is ignored.
-e [END], --eof[=END] Equivalent to -E END if END is specified.
Otherwise, there is no end-of-file string
--help Print a summary of the options to xargs.
-I R same as --replace=R (R must be specified)
-i,--replace=[R] Replace R in initial arguments with names
read from standard input. If R is
unspecified, assume {}
-L,-l, --max-lines=MAX-LINES Use at most MAX-LINES nonblank input lines per
command line
-l Use at most one nonblank input line per
command line
-n, --max-args=MAX-ARGS Use at most MAX-ARGS arguments per command
line
-P, --max-procs=MAX-PROCS Run up to max-procs processes at a time
-p, --interactive Prompt before running commands
--process-slot-var=VAR Set environment variable VAR in child
processes
-r, --no-run-if-empty If there are no arguments, run no command.
If this option is not given, COMMAND will be
run at least once.
-s, --max-chars=MAX-CHARS Limit commands to MAX-CHARS at most
--show-limits Show limits on command-line length.
-t, --verbose Print commands before executing them
--version Print the version number
-x, --exit Exit if the size (see -s) is exceeded
xargs
默认的命令是 echo
,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后
当作命令行参数传递给其后面的命令,并运行之,我们可以使用 -d 命令指定分隔符
参考示例
ls ./src/server/protobuf/*.pb.go | xargs -n1 -IX bash -c 'sed s/,omitempty// X > X.tmp && mv X{.tmp,}'
步骤拆解
-I R
,R可以为一个特殊的字符,起到替换参数的作用,omitempty
字段替换成空(预览模式)并输出到文件X.tmp,并且将文件 X.tmp 命名为X用于查询指定内容,打印匹配文本行。
格式:grep [-args] 'keywords' file [file1] [file..n]
常用参数:
从文本中查询打印内容
# 查看测试文本
[root@VM_0_3_centos ~]# cat text
1:123
2:234
3:345
4:456
5:567
6:678
7:789
# -r递归查询,-l只显示文件,查看包含123的文件
[root@VM_0_3_centos ~]# grep -rl '123' ./
./.bash_history
./awk.text
./d.text
./text
# -n显示行号,查看包含3的行
[root@VM_0_3_centos ~]# grep -n '3' ./text
1:1:123
2:2:234
3:3:345
# -v,查看不包含3的行
[root@VM_0_3_centos ~]# grep -v '3' ./text
4:456
5:567
6:678
7:789
# -c,计算包含3的行数
[root@VM_0_3_centos ~]# grep -c '3' text
3
# -e,匹配多个条件
[root@VM_0_3_centos ~]# grep -e '3' -e '4' text
1:123
2:234
3:345
4:456
# -o, 只输出匹配的文本
[root@VM_0_3_centos ~]# grep -o '23' text
23
23
# -x,只匹配全行的数据
[root@VM_0_3_centos ~]# grep -x '123' text
[root@VM_0_3_centos ~]# grep -x '1:123' text
1:123
从管道输入中查询打印内容
[root@VM_0_3_centos proc]# cat cpuinfo | grep -n 'core'
12:core id : 0
13:cpu cores : 1
sed在处理文本时是逐行读取内容,读到匹配的行就根据指令做操作,不匹配就跳过,常用于对文件的
增加``删除``修改``查询
sed的常用选项:
s命令修改文本
# 查看测试文本
[root@VM_0_3_centos ~]# cat text
1:123
2:234
3:345
4:456
5:567
6:678
7:789
# 预览模式-修改第一个匹配文本(此时源文件内容不会修改)
[root@VM_0_3_centos ~]# sed 's/3/0/' text
1:120
2:204
0:345
4:456
5:567
6:678
7:789
# 预览模式-修改所有匹配文本(此时源文件内容不会修改)
[root@VM_0_3_centos ~]# sed 's/3/0/g' text
1:120
2:204
0:045
4:456
5:567
6:678
7:789
# -i编辑模式修改文本(此时源文件会修改)
[root@VM_0_3_centos ~]# sed -i 's/123/s123/' text
[root@VM_0_3_centos ~]# cat text
1:s123
2:234
3:345
4:456
5:567
6:678
7:789
# -n 修改默认输出,输出只修改的行
[root@VM_0_3_centos ~]# sed -n 's/123/s123/p' text
1:s123
c命令覆盖文本所在行
[root@VM_0_3_centos ~]# sed '/3/c0' text
0
0
0
4:456
5:567
6:678
7:789
d命令删除文本
# 测试文本
[root@VM_0_3_centos ~]# cat d.text
1:123
2:234
3:345
4:456
5:567
6:678
7:789
# 预览模式-删除第一行
[root@VM_0_3_centos ~]# sed '1d' d.text
2:234
3:345
4:456
5:567
6:678
7:789
# 预览模式-删除最后一行
[root@VM_0_3_centos ~]# sed '$d' d.text
1:123
2:234
3:345
4:456
5:567
6:678
# 预览模式-删除匹配行
[root@VM_0_3_centos ~]# sed '/3/d' d.text
4:456
5:567
6:678
7:789
# -i编辑模式-删除空行
[root@VM_0_3_centos ~]# sed -i '/^$/d' d.text
1:123
2:234
3:345
4:456
5:567
6:678
7:789
# -预览模式-删除匹配除外所有行
[root@VM_0_3_centos ~]# sed '/3/!d' d.text
1:123
2:234
3:345
# -预览模式-删除1到2行
[root@VM_0_3_centos ~]# sed '1,2d' d.text
3:345
4:456
5:567
6:678
7:789
# -预览模式-从第一行开始,每2行就删除
[root@VM_0_3_centos ~]# sed '1~2d' d.text
2:234
3:345
5:567
7:789
i/a命令新增文本
# 预览模式-向第二行后面插入文本
[root@VM_0_3_centos ~]# sed '2a234aaaaa' text
1:123
2:234
234aaaaa
3:345
4:456
5:567
6:678
7:789
# 预览模式-向第最后一行后面插入文本
[root@VM_0_3_centos ~]# sed '$aenda' text
1:123
2:234
3:345
4:456
5:567
6:678
7:789
enda
# 预览模式-向所有匹配行后面新增文本
[root@VM_0_3_centos ~]# sed '/3/aa' text
1:123
a
2:234
a
3:345
a
4:456
5:567
6:678
7:789
# 预览模式-向最后一行前面插入文本
[root@VM_0_3_centos ~]# sed '$iendi' text
1:123
2:234
3:345
4:456
5:567
6:678
endi
7:789
-n选项 p命令打印输出文本
# 打印第二行
[root@VM_0_3_centos ~]# sed -n '2p' text
2:234
# 打印1到4行
[root@VM_0_3_centos ~]# sed -n '1,4p' text
1:123
2:234
3:345
4:456
# 从1行开始,每2行打印一次
[root@VM_0_3_centos ~]# sed -n '1~2p' text
1:123
3:345
5:567
7:789
# 打印匹配行
[root@VM_0_3_centos ~]# sed -n '/6/p' text
4:456
5:567
6:678
# 打印从匹配行开始,后4行
[root@VM_0_3_centos ~]# sed -n '/1/,4p' text
1:123
2:234
3:345
4:456
=打印行号
# 打印最后一行行号
[root@VM_0_3_centos ~]# sed -n '$=' text
7
# 打印匹配行号
[root@VM_0_3_centos ~]# sed -n '/3/=' text
1
2
3
awk是一种编程语言,用于在linux/unix下对文本数据进行处理,数据可以来自标准输入,文件或其他命令的输出。格式:awk 'BEGIN{ commands } pattern{ commands } END{ commands }' filenames
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
常用命令选项
$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 这个变量包含执行过程中当前行的文本内容。
FILENAME 当前输入文件的名。
FNR 同NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)。
IGNORECASE 如果为真,则进行忽略大小写的匹配。
NF 表示字段数,在执行过程中对应于当前的字段数。
NR 表示记录数,在执行过程中对应于当前的行号。
RS 记录分隔符(默认是一个换行符)。
awk的分隔符还分为两种,“输入分隔符” 和 “输出分隔符”
输入分隔符,英文原文为field separator,此处简称为FS,awk默认以空白字符为分隔符对每一行进行分割。
输出分割符,英文原文为output field separator,此处简称为OFS,即当我们要对处理完的文本进行输出的时候,以什么文本或符号作为分隔符。
AWK 包含两种特殊的模式:BEGIN 和 END。
BEGIN 模式指定了处理文本之前需要执行的操作
END 模式指定了处理完所有行之后所需要执行的操作
➜ /data cat 1.log
a b c d
1 2 3 4
➜ /data awk 'BEGIN{print "b1","b2"} {print $1,$4} END{print "e1","e2"}' 1.log
b1 b2
a d
1 4
e1 e2
➜ /data
# 输出每一行内容
[root@VM_0_3_centos ~]# awk '{print $0}' awk.text
1:123
2:234
3:345
# 输出以:分隔的第一列
[root@VM_0_3_centos ~]# awk -F: '{print $1}' awk.text
1
2
3
# 输出以:分隔的第二列
[root@VM_0_3_centos ~]# awk -F: '{print $2}' awk.text
123
234
345
# 格式化输出(在awk的print语句块中双引号是被当作拼接符使用)
[root@VM_0_3_centos ~]# awk -F: '{print $1 "@" $2}' awk.text
1@123
2@234
3@345
# 输出第一列和第二列内容
[root@VM_0_3_centos ~]# awk '-F:' '{print $1,$2}' awk.text
1 123
2 234
3 345
# 输出每一行行号,并且输出总行数
[root@VM_0_3_centos ~]# awk '{print NR,$1,$2} END{print "total rows:" NR}' awk.text
1 1:123
2 2:234
3 3:345
total rows:3
# 可以用-v传递外部变量
[root@VM_0_3_centos ~]# VAR=666
[root@VM_0_3_centos ~]# echo | awk -v a=$VAR '{print a}'
666
# next用于跳过当前行
[root@VM_0_3_centos ~]# awk 'NR%2==0{next}{print NR,$0}' awk.text
1 1:123
3 3:345
- PID 进程id
- USER 用户名
- PR 优先级
- NI nice值 -20到19,越小优先级越高
- VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- SWAP 进程使用的虚拟内存中,被换出的大小,单位kb // 将不常用的内存交换到磁盘,提高物理内存使用性能和空间
- RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- CODE 可执行代码占用的物理内存大小,单位kb
- DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
- SHR 共享内存大小,单位k
- 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
- 计算某个进程所占的物理内存大小公式:RES – SHR
- %CPU 上次更新到现在的CPU时间占用百分比
- %MEM 进程使用的物理内存百分比
- TIME 进程使用的CPU时间总计,单位秒;TIME+ 进程使用的CPU时间总计,单位1/100秒
- COMMAND 命令名/命令行
随机纯数字(20位为例):
head /dev/urandom | tr -dc 0-9 | head -c 20
随机小写字母+数字(20位为例):
head /dev/urandom | tr -dc a-z0-9 | head -c 20
随机大小写字母+数字(20位为例):
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 20
其中一种:
cat /dev/urandom | LC_ALL=C tr -dc ":graph:" | fold -w 10 |head -10
login-path是MySQL5.6开始支持的新特性。通过借助mysql_config_editor工具将登陆MySQL服务的认证信息加密保存在.mylogin.cnf文件(默认位于用户主目录) 。之后,MySQL客户端工具可通过读取该加密文件连接MySQL,避免重复输入登录信息,避免敏感信息暴露。
mysql_config_editor使用帮助:
配置:
mysql_config_editor set --login-path=test --user=test_user --host=127.0.0.1 --port=3306 --password
其中可配置项
-h,–host=name 添加host到登陆文件中
-G,–login-path=name 在登录文件中为login path添加名字(默认为client)
-p,–password 在登陆文件中添加密码(该密码会被mysql_config_editor自动加密)
-u,–user 添加用户名到登陆文件中
-S,–socket=name 添加sock文件路径到登陆文件中
-P,–port=name 添加登陆端口到登陆文件中
显示配置:
mysql_config_editor print --login-path=test #显示执行的login-path配置
mysql_config_editor print --all #显示所有的login-path信息
删除配置:
mysql_config_editor remove --login-path=test
其中可删除项
-h,–host=name 添加host到登陆文件中
-G,–login-path=name 在登录文件中为login path添加名字(默认为client)
-p,–password 在登陆文件中添加密码(该密码会被mysql_config_editor自动加密)
-u,–user 添加用户名到登陆文件中
-S,–socket=name 添加sock文件路径到登陆文件中
-P,–port=name 添加登陆端口到登陆文件中
重置配置:
mysql_config_editor reset --login-path=test
使用login-path登录:
shell>mysql --login-path=test
若要登录其他主机、其他端口,或者添加其他额外参数,直接在上述命令后添加即可
shell>mysql --login-path=test -h host1 -P port1 #登录host1:poet1上的MySQL
shell>mysql --login-path=test -h host1 -P port1 test_db #登录 host1:poet1 上的MySQL中的test_db库
#!/usr/bin/expect
spawn ssh -p {端口号} {user}@{IP}
expect "password:"
send "{password}\r"
interact
➜ ~ sl
➜ ~ cowsay
➜ ~ cmatrix
➜ ~ figlet andrekzwu
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。