chattr 命令用于改变文件属性 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:
语法
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]
参数
实例
# 不能改动文件
chattr +i /etc/resolv.conf
# 查看权限
lsattr /etc/resolv.conf
----i-------- /etc/resolv.conf
# 只能追加不能删除
chattr +a /var/log/messages
uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。 uniq 可检查文本文件中重复出现的行列
语法
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
参数
实例
# 删除重复行
cat << EOF | uniq -c
test 30
test 30
test 30
Hello 95
Hello 95
Hello 95
Hello 95
Linux 85
Linux 85
EOF
3 test 30
4 Hello 95
1 Linux 85
1 Linux 85
# 排序删除
cat << EOF | sort |uniq -c
test 30
test 30
test 30
Hello 95
Hello 95
Hello 95
Hello 95
Linux 85
Linux 85
EOF
4 Hello 95
1 Linux 85
1 Linux 85
3 test 30
# 找出重复行
cat << EOF |uniq -d
test 30
test 30
test 30
Hello 95
Hello 95
Hello 95
Hello 95
Linux 85
Linux 85
Linux 85
EOF
test 30
Hello 95
Linux 85
Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字
语法
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
参数
实例
1、以字节定位
who|cut -b 3
o
2、以字符定位
who|cut -c 3
t
3、自定义分隔符
cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
Linux sort 命令用于将文本文件内容加以排序。
sort 可针对文本文件的内容,以行为单位来排序
语法
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件][-k field1[,field2]]
参数
实例
1、直接排序
cat << EOF | sort
test 30
Hello 95
Linux 85
EOF
Hello 95
Linux 85
test 30
2、使用 -k 参数设置对第二列的值进行重排
cat << EOF | sort -k 2
test 30
Hello 95
Linux 85
EOF
test 30
Linux 85
Hello 95
3、使用 -r 进行倒序排序
cat << EOF | sort -r
test 30 99
Hello 95 76
Linux 85 35
EOF
test 30 99
Linux 85 35
Hello 95 76
Linux grep 命令用于查找文件里符合条件的字符串。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据
语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数
实例
1、查询匹配字符的文件
cat /etc/passwd |grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2、查询匹配字符前一行
cat /etc/passwd |grep root -B 1
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
3、查询匹配字符后一行
cat /etc/passwd |grep root -A 1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
4、查询匹配字符前后一行
cat /etc/passwd |grep root -C 1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
5、查询匹配以op开头的行
cat /etc/passwd |grep ^op
operator:x:11:0:operator:/root:/sbin/nologin
6、查询匹配以bash结尾的行
cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
devops:x:1000:1000::/home/devops:/bin/bash
Linux sed 命令是利用脚本来处理文本文件。 sed 可依照脚本的指令来处理、编辑文本文件。 Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作
sed元字符
- ^ # 匹配行开始,如:/^sed/匹配所有以sed开头的行。
- $ # 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
- . # 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
- * # 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
- [] # 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。
- [^] # 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
- \(..\) # 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
- & # 保存搜索字符用来替换其他字符,如s/love/ **&** /,love这成 **love** 。
- \< # 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
- \> # 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
- x\{m\} # 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
- x\{m,\} # 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
- x\{m,n\} # 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
实例
1、像文本中添加一行
cat << EOF > testfile | sed -e 4a\newLine testfile
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki
EOF
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newLine
Google
Taobao
Runoob
Tesetfile
Wiki
2、删除其中的几行
cat << EOF | nl | sed '2,5d'
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki
EOF
1 HELLO LINUX!
6 Taobao
7 Runoob
8 Tesetfile
9 Wiki
3、全量替换
sed -i 's/book/books/g' file
Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示
语法
find path -option [ -print ] [ -exec -ok command ] {} \;
参数
实例
1、查询当前目录及其子目录中所有以"xxx"结尾的文件
find . -name "*.log"
2、将当前目录及其子目录中的所有文件列出
find . -type -f
3、将当前目录及其子目录下所有最近 20 天内更新过的文件列出
find . -ctime 20
4、将当前目录及其子目录下所有最近 20 天内访问过的文件列出
find . -atime 20
5、查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们
find /var/log -type f -mtime +7 -ok rm {} \;
6、查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件
find . -type f -perm 644 -exec ls -l {} \;
7、查找超过10MB的所有.mp3文件,并使用一个命令删除它们
find . -type f -name "*.mp3" -size +10m -exec rm -rf {} \;
8、找到大于50MB且小于100MB的所有文件
find . -type f -size +50m -size -100m
jq 是 stedolan 开发的一个轻量级的和灵活的命令行JSON处理器,源码请参考 jq 项目主页 jq 用于处理JSON输入,将给定过滤器应用于其JSON文本输入并在标准输出上将过滤器的结果生成为JSON。 最简单的过滤器是.,它将jq的输入未经修改地复制到其输出中(格式设置除外)
语法
jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]
参数
null
作为单个输入值;实例
有一json文件(test.json)内容如下,使用jq做相关数据提出
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"annotations": {
"meta.helm.sh/release-name": "prometheus",
"meta.helm.sh/release-namespace": "kube-system"
},
"creationTimestamp": "2022-05-05T09:19:16Z",
"labels": {
"app": "prometheus",
"app.kubernetes.io/managed-by": "Helm",
"chart": "prometheus-11.12.1",
"component": "server",
"heritage": "Helm",
"release": "prometheus"
},
"managedFields": [
{
"apiVersion": "v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:annotations": {
".": {},
"f:meta.helm.sh/release-name": {},
"f:meta.helm.sh/release-namespace": {}
},
"f:labels": {
".": {},
"f:app": {},
"f:app.kubernetes.io/managed-by": {},
"f:chart": {},
"f:component": {},
"f:heritage": {},
"f:release": {}
}
},
"f:spec": {
"f:externalTrafficPolicy": {},
"f:ports": {
".": {},
"k:{\"port\":80,\"protocol\":\"TCP\"}": {
".": {},
"f:name": {},
"f:nodePort": {},
"f:port": {},
"f:protocol": {},
"f:targetPort": {}
}
},
"f:selector": {
".": {},
"f:app": {},
"f:component": {},
"f:release": {}
},
"f:sessionAffinity": {},
"f:type": {}
}
},
"manager": "Go-http-client",
"operation": "Update",
"time": "2022-05-05T09:19:16Z"
}
],
"name": "prometheus-server",
"namespace": "kube-system",
"resourceVersion": "54247",
"selfLink": "/api/v1/namespaces/kube-system/services/prometheus-server",
"uid": "8eb54da5-f64e-4ea4-a5d1-2493bc1673cd"
},
"spec": {
"clusterIP": "10.96.3.118",
"externalTrafficPolicy": "Cluster",
"ports": [
{
"name": "http",
"nodePort": 31090,
"port": 80,
"protocol": "TCP",
"targetPort": 9090
}
],
"selector": {
"app": "prometheus",
"component": "server",
"release": "prometheus"
},
"sessionAffinity": "None",
"type": "NodePort"
},
"status": {
"loadBalancer": {}
}
}
1、.key: 获取一个键的值
cat test.json | jq .metadata.lebels
{
"app": "prometheus",
"app.kubernetes.io/managed-by": "Helm",
"chart": "prometheus-11.12.1",
"component": "server",
"heritage": "Helm",
"release": "prometheus"
}
2、.[],[]: 获取一个数组
cat test.json | jq .metadata.managedFields[0].apiVersion
"v1"
3、keys: 获取数组中的键
cat test.json | jq '.metadata.managedFields[0]|keys'
[
"apiVersion",
"fieldsType",
"fieldsV1",
"manager",
"operation",
"time"
]
4、,: 使用过滤器
cat test.json | jq '.metadata.managedFields[0]|.manager,.time'
"Go-http-client"
"2022-05-05T09:19:16Z"
5、has: 判断是否存在某个key
cat test.json | jq '.metadata.managedFields[0]|has("name")'
false
6、{key}: 构造对象
cat test.json | jq '.metadata.managedFields[0].manager |{"name": .}'
{
"name": "Go-http-client"
}
7、length: 查看元素个数
cat test.json | jq '.metadata.managedFields[0]|.manager,.time'
6
8、map(): 改变数组的值
cat test.json | jq '.metadata.managedFields[0]|.manager,.time|map_values(.+"ss")'
9、-r: 去除引号
cat test.json | jq -r '.metadata.managedFields[0]|.manager,.time'
Go-http-client
2022-05-05T09:19:16Z
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
参数
实例
1、文本匹配输出
cat << EOF | awk '{printf "%-8s %-10s\n",$1,$4}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2 a
3 like
This's
10 orange,apple,mongo
2、指定分隔符文本匹配输出
cat << EOF | awk -F , '{print $1,$4}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2 this is a test
3 Do you like awk
This's a test
10 There are orange
3、使用变量
cat << EOF | awk -va=1 '{print $1,$1+a}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2 3
3 4
This's 1
10 11
4、使用脚本
# 创建awk脚本
cat << 'EOF' > test.awk
#!/bin/awk -f
#运行前
BEGIN {
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
EOF
# 使用脚本处理文件
cat << EOF | awk -f test.awk source
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
EOF
NAME NO. MATH ENGLISH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
TOTAL: 638 786 700
AVERAGE: 63.80 78.60 70.00
4、过滤第一列大于2的行
cat << EOF | awk '$1 >2'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
3 Do you like awk
This's a test
10 There are orange,apple,mongo
5、过滤第一列等于2的行
cat << EOF | awk '$1 ==2 {print $1,$3}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2 is
6、过滤第一列大于2并且第二列等于’Are’的行
cat << EOF | awk '$1>2 && $2=="Are" {print $1,$2,$3}'
2 this test
3 Are awk
This's a
10 There apple
EOF
3 Are awk
7、输出第二列包含 “th”,并打印第二列与第四列
cat << EOF | awk '$2 ~ /th/ {print $2,$4}'
2 this test
3 Are awk
This's a
10 There apple
EOF
this
8、忽略大小写
cat << EOF | awk 'BEGIN{IGNORECASE=1} /this/'
2 this test
3 Are awk
This's a
10 There apple
EOF
2 this test
This's a
9、取反
cat << EOF | awk '$2 !~ /th/ {print $2,$4}'
2 this test
3 Are awk
This's a
10 There apple
EOF
Are
a
There
10、计算文件大小
ls -l *.tgz | awk '{sum+=$5} END {printf "%.2fk",sum/1024}'
135.02k
11、打印99乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
1、查出哪个IP地址连接最多
netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sed '/^$/d'|sort|uniq -c|sort -rn
2、查出那个ip登陆失败次数最多
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|grep [0-9]|sort|uniq -c|sort -rn|awk '{print "访问IP: "$2" => 访问次数 "$1}'
3、查询nginx访问最多的IP排行
cat /var/log/nginx/access.log | cut -d ' ' -f 1 | sort | uniq -c | sort -rn | awk '{print $2}' | head -n 10
4、查询nginx访问最多的URL排行
cat /var/log/nginx/access.log |awk '{print $1,$7}'|grep ^[0-9]|sort|uniq -c|sort -rn|head -n 10
5、批量查找替换
sed -i "s/oldstring/newstring/g" `grep oldstring -rl path`