grep
1 、 打印文件的非空行,非注释
cat 1.txt | egrep "^$|#"
2、-A -B -C 的区别
-A num:这个选项让grep显示匹配行以及其后的num行。例如,grep -A 3 "pattern"会显示匹配的行以及接下来的三行。
-B num:这个选项让grep显示匹配行以及其前的num行。例如,grep -B 3 "pattern"会显示匹配的行以及之前的三行。
-C num:这个选项让grep显示匹配行以及其前后的各num行。例如,grep -C 3 "pattern"会显示匹配的行以及其前后的三行。从本质上来说,这个选项可以看作是-A和-B的结合。
3、grep结合其他命令一起使用
find /path/to/directory -type f -name "*.txt" | xargs grep "pattern"
cat file.txt | grep "pattern" | xargs rm
cat file.txt | grep "pattern" | awk '{print $1}'
cat file.txt | grep "pattern" | cut -d':' -f2-
grep查看已经打开注释的行
grep "^[a-Z]" redis.conf
awk
AWK的主要功能包括:
- 变量操作:可以定义变量,进行赋值、数学运算等操作。
- 条件语句:可以实现条件判断和循环控制。
- 模式匹配:可以通过正则表达式进行字符串匹配和查找。
- 输入/输出:可以读取标准输入和输出结果。
- 自定义函数:可以定义自己的函数,并在脚本中使用。
- 数组操作:可以处理多维数组。
- 内置函数:提供了大量的内置函数,如字符串操作、数学运算、日期时间等。
- 关联数组:可以实现键值对的数据结构。
- 文件操作:可以读取、写入、追加等操作文件。
- 管道操作:可以与其他命令进行管道操作,实现数据流的控制。
1、根据df -h并更根据挂载目录生成挂载命令,复制命令到其他主机,进行挂载操作
df -h | awk '{print "mount -t nfs -o nolock" " " $1 " " $NF}'
1.1 批量卸载nfs 挂载
这个是基于命令挂载的nfs
1、 df -h 正常没有被卡住的批量卸载方法
df -h | grep mnt | awk '{print $NF}' | while read -r name ; do umount -l $name ; done
2、df -h 不正常,出现有 nfs卡住的情况
cat /etc/mtab | grep mnt | awk '{print $2}' | while read -r name ; do umount -l $name ; done
2、打印文件的非空行非注销
awk -F '#' '($1) {print $1}' main.cf
3、打印文件最后一行
awk 'NF{a=$0}END{print a}' file.txt
awk打印倒数第一行
cat aaa | awk '{print $(NF-1)}'
4、统计nginx日志接口信息打印大于5秒的URL和返回码
cat access.log | grep 'yxpt' | awk -F "|" '{if($3 > 5) print $2,$9}' | sort -n | uniq -c
awk 在日志查询中的应用
1、查看nginx的200返回码
cat access.log | awk -F "|" '(200) {print $2}' | wc -l
2、统计访问最多的ip
awk ‘{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}’ 日志文件 | sort -n | tail
3、查看nginx日志中出现100次以上的IP
cat access_log |cut -d ’ ’ -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less
4、查看最近访问量最高的文件
cat access_log |tail -10000|awk ‘{print $7}’|sort|uniq -c|sort -nr|less
5、查看系统根目录的空间使用率和剩余空间
df -hTP | awk '{if($7~"/$")print $6}'
df -h | awk '/\/$/{print $4}'
6、统计数据库,web服务等应用,连接最多的ip
netstat -ntu |awk ‘{print $5}’ |sort | uniq -c| sort -nr
netstat -tunlpa|grep mysql|awk '{print $5}'|awk -F":" '{print $1}'|sort|uniq
7、awk对打印指定的行和指定列的处理
awk打印第一行
awk 'NR==1' filename
awk打印最后一列
awk 'END {print}' filename
awk打印指定的行
awk 'NR==<line_number>' filename
awk打印第二行第一列
awk 'NR==1 {print $2}' filename
8、使用awk 删除指定的行
删除文件中的第三行,不要重定向到原文件中,重定向到原文件中,是一个空文件
awk 'NR!=3' /etc/hosts > /etc/hosts-new
mv /etc/hosts-new /etc/hosts
9、使用awk 去除字段之间的空格
10、awk打印nginx日志,返回码不是200,并只输出次数超过100次的ip
sudo cat /data1/logs/nginx/access.log | grep -v 'User_request_status:200' | awk -F "|" '{print $5}' | sort -n | uniq -c | awk '$1 > 100'
11、awk 打印去除文件重复行
awk -F, '!c[$2,$4]++' file.txt
-F,:指定逗号作为字段分隔符。
‘!c[$2,$4]++’:根据单引号里面的条件表达式过滤数据,用于检查当前行中的第2和第4个字段是否是第一次出现;c是一个数组,用于存储某个值出现的总次数;++后缀自增先返回数组元素的值(初始为0),然后再加1;将次数当作逻辑值来使用,非零整数被解释为true,而零被解释为false;再通过!取反,第一次出现,则该表达式为真,将输出该行,否则跳过该行。
这个命令的工作原理是,对于输入文件中每一行中的第2和第4个字段,都会检查是否已经出现过。如果是第一次出现,则输出该行,否则跳过该行。最终,输出根据指定字段识别出的第一个唯一的行。
这里,逗号用于分隔第2和第4个字段,并作为数组键的一部分。通过这种方式,我们可以基于多个字段的组合进行去重处理。
12、awk 打印包含的字符和不包含的字符
awk -F'|' '{if ($9 == "/open-sd/") {print $9}}' access.log
sed
1、永久关闭seliunx
sed -i 's/enforcing/disabled/' /etc/selinux/config
2、永久关闭交换分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
3、删除指定的行
删除文件中的第三行
sed -i '3d' /etc/hosts
4、在某一关键字下追加一行配置文件
sed -i '/\[Service\]/a LimitMEMLOCK=infinity' /usr/lib/systemd/system/elasticsearch.service
5、AWK打印文件
# 打印第一行
sudo cat /usr/local/nginx/logs/access.log | awk 'NR==1{print $0}'
## 打印1到3行
sudo cat /usr/local/nginx/logs/access.log | awk 'NR==1,NR==3{print $0}'
## 或者
sudo cat /usr/local/nginx/logs/access.log | awk '(NR>=1)&&(NR<=3){print $0}'
# 输出第一行和第三行内容
sudo cat /usr/local/nginx/logs/access.log | awk '(NR==1)||(NR==3){print $0}'
# 输出基数行内容
sudo cat /usr/local/nginx/logs/access.log | awk '(NR%2)==1 {print $0}'
# 输出偶数行内容
sudo cat /usr/local/nginx/logs/access.log | awk '(NR%2)==0 {print $0}'
# 查找包含root的行内容
awk '/root/{print $0}' /etc/passwd
# 查找以root开头的内容
awk '/^root/{print $0}' /etc/passwd
# 查找以/root/usr结尾的行内容
awk '/\/root\/usr$/{print $0}' /etc/passwd
# #匹配以/bash结尾的行,然后执行x++,并打印x和行内容
awk 'BEGIN {x=0}; /bash$/{x++; print x,$0}; END{print x}' /etc/passwd
# 输出每行以“:”为分隔符的第三个字段
awk -F ":" '{print $3}' /etc/passwd
# 输出以“:”为分隔符的第一个字段和最后一个字段
awk -F ":" '{print $1,$NF}' /etc/passwd
# 输出以s开头的行内容,并以:为分隔符的第一个和最后一个字段的内容
awk -F ":" '/^s/{print $1,$NF}' /etc/passwd
# 找出以:为分隔符的第三个字段的值小于等于5的行,并输出第1、3以及最后一个字段的内容
awk -F ":" '($3<=5){print $1,$3,$NF}' /etc/passwd
# 需要加上大括号指定控制语句操作
awk -F ":" '{if($3<=5){print $0}}' /etc/passwd
# 输出第7个字段中包含login的行,并输出其行号
awk -F ":" '$7~"login" {print NR,$0}' /etc/passwdawk 'BEGIN {N=0; while("cat /etc/passwd" | getline)n++; print n}'
# 输出第n行的整行内容
awk -F '字段分隔符' 'NR==n {print $0}'
# 输出第n行的第一个字段的内容
awk -F '字段分隔符' 'NR==n {print $1}'
# 输出第n行的第一个字段和最后一个字段的内容
awk -F '字段分隔符' 'NR==n {print $1, $NF}'
# 输出第n行到第m行的第一个字段的内容
awk -F '字段分隔符' 'NR==n, NR==m {print $1}'
# 输出第n行到第m行的第一个字段的内容(另一种写法)
awk -F '字段分隔符' 'NR>=n && NR<=m {print $1}'
# 输出第n行和第m行的第一个字段的内容
awk -F '字段分隔符' 'NR==n || NR==m {print $1}'
# 输出包含指定字符串的行的第一个字段的内容
awk -F '字段分隔符' '/字符串/ {print $1}'
# 输出匹配正则表达式的行的第一个字段的内容
awk -F '字段分隔符' '/正则表达式/ {print $1}'
# 输出第一个字段的数值大于等于n的整行内容
awk -F '字段分隔符' '$1>=n {print $0}'
# 输出第一个字段包含指定字符串的整行内容
awk -F '字段分隔符' '$1 ~ "字符串" {print $0}'
# 说明:
# ~ (包含)
# !~ (不包含)
# == (等于)
# != (不等于)
awk -F' |,|\\[|]:' '{print $2,$(NF-1),$NF}' app.log
代码解释:
-F' |,|\\[|]:':指定空格,或者逗号,或者左方括号"\\[",或者右方括号和冒号"]:"的组合作为分隔符。由于方括号是特殊字符,需要转义,斜线也是特殊字符,也需要转义,因此使用"\\["表示一个左方括号。如果使用单独的冒号作为分隔符之一,时间也会被分隔,因此使用"]:"组合作为一个分隔符。
{print $2,$(NF-1),$NF}:输出第2个、倒数第2个和最后一个字段,NF表示当前记录的字段数量,$NF表示最后一个字段,$(NF-1)表示倒数第2个字段,以此类推。将输出如下数据:
find
1、每台web服务器的网站根目录下执行以下命令,打印文件信息
find `pwd` -type f -exec ls -l {} \;
或者执行以下命令同时将文件信息保存到“服务器ip-时间.txt”的文件中
time1=`date "+%Y%m%d%H%M%S.txt"`;ip1=`ifconfig 'eth0'|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "`;find `pwd` -type f -exec ls -l {} \;>$ip1-$time1;unset time1;unset ip1;
2、查看全局文件,修改配置文件中的,数据库连接密码,并对文件进行备份
find -type f | xargs sed -i 's/旧密码/新密码/g' {}
# 使用 find 查找目录下的所有 .txt 文件
find /path/to/your/directory -type f -name "*.txt" | while read file
do
# 先进行备份,后缀为 .bak
cp "$file" "$file.bak"
# 使用 sed 命令查找并替换文件中的字符串
sed -i 's/旧字符串/新字符串/g' "$file"
done
3、find命令,查看当前目录所有子目录的JAVA文件,文件查出来后怎么打包?
tar -cvf java_files.tar $(find . -type f -name "*.java")
4、 查找对应的目录,并移动到指定的目录中
sudo find 原日志路径 -name 'web-*-2023-08-1*.log.gz' -exec mv {} 目标路径 \ ;
5、删除文件超过一天的文件
#!/bin/bash
find 文件路径 -mtime +1 -type f -exec rm -rf {} \;
wait
find 文件路径 -mtime +1 -type f -exec rm -rf {} \;
- 这个命令会查找 /home/king/log/ 目录下在昨天或更早之前修改的所有普通文件(不包括已经压缩的 .gz 文件),然后将这些找到的文件进行压缩。
find /home/king/log/ -type f -daystart -mtime +0 ! -iname "*.gz" | xargs -r gzip -f
6、find查询目录一下,带有web-info的关键字的文件名称
## 相对目录
find /var/lib/docker/ -type f -name '*web-info*'
## 当前目录及其子目录中查找
find ./ -type f -name '*web-info*'
## 如果你不想区分大小写,可以使用-iname选项代替-name
find /path/to/search -type f -iname '*web-info*'
7、查看目录以下是否具有带有这些名字的文件
for i in {7z,.tar,.gz,.zip,.rar,.txt,.bak,.sql,.pyc,.swp,.old,.index.jsp~,.DS_Store} ;do sudo find /home/caiyun/nginx/html -type f -name "*$i" ;done
使用命令扫描:> out.txt;for i in `cat tmp.txt`;do find /tmp -name "$i" >> out.txt;done
使用关键字 文件 tmp.txt 进行匹配扫描 注:/tmp 为需要扫描的目录,可以根据需要扫描的目录进行修改。
以附件形式提供网站目录文件信息,如详见《附件名.txt》
方法:
如在每台web服务器的网站根目录下执行以下命令,打印文件信息
find `pwd` -type f -exec ls -l {} \;
或者执行以下命令同时将文件信息保存到“服务器ip-时间.txt”的文件中
time1=`date "+%Y%m%d%H%M%S.txt"`;ip1=`ifconfig 'eth0'|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "`;find `pwd` -type f -exec ls -l {} \;>$ip1-$time1;unset time1;unset ip1;
8、查看目录以下的文件并对文件进行压缩处理
sudo find /var/lib/docker/logs/abc -type f -name "*.log" -mtime +30 |xargs sudo gzip
# 定义目标迁移目录
TARGET_DIR="/path/to/target/directory"
# 使用 find 查找并压缩 .log 文件并迁移到目标目录
sudo find /var/lib/docker/logs/abc -type f -name "*.log" -mtime +30 | while read file
do
# 压缩文件
sudo gzip "$file"
# 移动压缩后的文件到目标目录
sudo mv "$file.gz" "$TARGET_DIR"
done
9、 查看目录下指定的文件
sudo find /opt/king/ -type f -name "*.sh" | while read -r file; do sudo cat $file; done
10、查找指定目录下,大小为TB的子目录,并以人类可读的方式显示它们的大小。
sudo find /var/lib/docker/king/ -type d -maxdepth 1 -exec du -sh {} \; |grep "T"
11、查找所有正在运行的Docker容器,提取其进程ID、容器ID、名称和工作目录,并筛选出包含特定字符串的容器信息。
sudo docker ps -q | xargs sudo docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' |grep "xxx"
1、sudo docker ps -q:使用docker ps命令列出所有正在运行的Docker容器,-q选项表示只输出容器的ID(不包括其他信息)。
2、 | xargs sudo docker inspect --format ‘{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}’:使用管道将获取到的容器ID传递给xargs,xargs会将这些ID作为参数传递给后面的docker inspect命令。docker inspect用于获取容器的详细信息,–format '{{…}}'指定输出格式,输出每个容器的PID(进程ID)、ID、名称和工作目录。