grep awk sed find 应用

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. 变量操作:可以定义变量,进行赋值、数学运算等操作。
  2. 条件语句:可以实现条件判断和循环控制。
  3. 模式匹配:可以通过正则表达式进行字符串匹配和查找。
  4. 输入/输出:可以读取标准输入和输出结果。
  5. 自定义函数:可以定义自己的函数,并在脚本中使用。
  6. 数组操作:可以处理多维数组。
  7. 内置函数:提供了大量的内置函数,如字符串操作、数学运算、日期时间等。
  8. 关联数组:可以实现键值对的数据结构。
  9. 文件操作:可以读取、写入、追加等操作文件。
  10. 管道操作:可以与其他命令进行管道操作,实现数据流的控制。

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、名称和工作目录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

运维螺丝钉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值