首页 > 系统相关 >Shell 小技能

Shell 小技能

时间:2024-05-26 12:11:32浏览次数:23  
标签:Shell grep 指定 命令 awk print txt 技能

这也是一种编程。

Shell 是一门短小精悍的胶水型语言,可以组合各种 Linux 实用工具进行日常临时任务处理。Shell 就像一把匕首,其强大之处,在于能够灵活组合能力。

掌握 Shell命令组合方式也是一个实用编程小技能。

Shell 组合

Shell 命令组合主要有如下方式:

  • | : 管道符号,将上一个命令的结果写入一个临时文件,然后读取每一行作为输入传递到下一个命令的参数里。
  • >, < : 重定向符号,将输出重定向到文件( 或标准输入输出)里,或者重定向指向文件输入(标准输入输出)。
  • && : 组合执行多个命令。
  • $(cmd) 将 cmd 的命令执行结果原地替换到其所在的位置。
  • 正则表达式:通常用于 grep, sed, awk 程序中,筛选、替换满足条件的文本。
  • cut:根据指定字段、指定列筛选指定的列或列集合。
  • awk:根据指定字段或指定条件筛选列或列集合;生成格式化内容。
  • grep : 根据指定正则表达式筛选满足正则表达式的行。
  • sed: 根据指定正则表达式替换文本。
  • find: 筛选满足条件的文件并输出文件路径。
  • xargs: 批量处理命令,将上一个命令的执行结果的每一行通过管道传递给 xargs 指定的命令的参数。{} 作为参数占位符。
  • sort: 根据指定列排序。

以下给出日常开发工作中的一些实际任务及例子,读者可以在自己的工作中多练习多体会,逐渐掌握。如果有不懂不会的,就问 AI 吧。

文本处理

文本处理常用工具:cat, grep, awk, sed, cut, sort, uniq

提取关键字并组成数组查询条件

排查问题或故障修复时,常常需要从日志里提取所需要的内容,并拼成数据库的 in 条件。

解读:

  • cat : 读取和显示文件内容;
  • awk: 筛选指定分隔符后面的字段内容;根据指定格式生成行内容;
  • grep: 筛选含有指定关键字或匹配正则的行;
  • sed: 文本替换。
  • | : 管道符号,将上一个命令的结果作为输入传递到下一个命令的参数里。
cat webfileexist.txt | awk -F 'existDetectionId: ' '{print $2}' | grep -v "^$" | awk '{printf "%s%s", (NR>1?",":""), "\""$0"\""} END{print "]"}'  | sed 's/^/[/'

webfileexist.txt

 webfile is exist        existDetectionId: abcdeft
 webfile is exist        existDetectionId: ggwsdf

输出

["abcdeft", "ggwsdf"]

筛选/排序匹配的列

可以打印日志耗时,然后从日志中提取耗时信息,生成数据和图表。

awk -F'=' ' $4 > 50 {print } ' rt_costs.txt > rt_50_costs.txt 

awk -F'=' '  {print $3} ' rt_costs.txt | sed 's/, cost_time//g' | sort | uniq -c | awk '{print $2" "$1}' | sort -rnk2

rt_costs.txt

2023-04-26 16:29:16.392 [INFO]: [ids_detection_kafka-worker-24] - c.q.i.d.p.MethodMeasureAspect - detectionId=3f347c3e36d04feb939ac783931d5070252, method=DetectionDoSaver_process, cost_time=94
2023-04-26 16:29:16.392 [INFO]: [ids_detection_kafka-worker-27] - c.q.i.d.p.MethodMeasureAspect - detectionId=90661520f1fa47269d6ea930041e8a23255, method=DetectionDoSaver_process, cost_time=93
2023-04-26 16:29:16.397 [INFO]: [ids_detection_kafka-worker-26] - c.q.i.d.p.MethodMeasureAspect - detectionId=62163fa11af840a584286d322575ef7e254, method=DetectionFixedFilter_process, cost_time=2

日志查看和处理

tail -100f info.log | grep "method="  
grep -E "A|B" info.log

ls info.20220616.* | xargs -I {} grep "cdcCheckCache hit is black" {} > /home/blackhit.log

ls info.20220615.* | xargs -I {} grep "send webshell cdc task to kafka, size" {} | cut -f 5 -d ":" | sed 's/^[ \t]*//g' | awk '{sum += $1};END {print sum}'

grep -r "cdcCheckCache hit is black" info.20220616.*

kubectl logs -f $(kubectl get po -A | grep ids-detect | awk '{print $2}') -n $(kubectl get po -A | grep ids-detect | awk '{print $1}') main | grep --color=auto "cost_time" | awk -F"=" ' $3 > 50 {print } '

文件处理

通常用 find 查找到满足指定条件的文件集合,然后用 xargs -I {} 命令 {} 来逐一处理。其中 {} 是将 find 命令查到的结果逐个取出的值。

找到满足指定条件的文件集合中的重复文件

find . -name "*.java" > /tmp/javafile.txt &&  sed -E  's?^\./.+/([a-zA-Z]+\.java).*$?\1?g' /tmp/javafile.txt | sort | uniq -d

复制或删除大量文件

避免 shell argument too long 报错。

find . -name "*.java" | xargs -I {} cp {} /tmp
find . -name "*.java" | xargs -I {} rm -rf {}

查找和删除文件

find ~/[0-9]* -name "*.csv" -mtime +29 -type f|while read file; do rm -f $file; done

find ~/ -size +100M -mtime +27 -type f | while read file; do rm -f $file; done

find . -size +100M | xargs -I {} ls -hl {}

查看目录占用空间情况

磁盘快满,需要看看磁盘空间占用情况,考虑可以清理哪些文件。

du -ahx | sort -rh | head -5
du -d 1 -h  | sort -rh | head -20

du -ah /var/  | sort -rh | head -10

日常任务管理

查看占用80端口的进程

有时部署应用时,会报 80 端口已占用。此时,需要找到占用 80 端口的进程并杀死进程。注意:必须加 sudo 才会展示进程PID。

sudo kill -9 $(sudo netstat -lnp | grep :80)

批量杀死指定关键字的进程

ps aux | grep "$1" | awk '{print $2}' | xargs -I {} sudo kill -9 {}

supervisorctl

启动和重启命令。

这里主要展示如何筛选指定条件的结果中的字段、生成命令内容、写入文件和执行文件的方法。

grep 根据关键字筛选行; cut 根据分隔符和指定字段位置筛选列; awk 根据结果生成命令; > 将内容写入文件; && 用于连接多个命令。


sudo supervisorctl status | grep RUNNING | cut -f 1 -d' ' | grep '\-8' | awk '{print "sudo supervisorctl stop " $0"\n" }' > /tmp/stop.sh && sh /tmp/stop.sh 

sudo supervisorctl status | grep STOPPED |cut -f 1 -d' ' | grep '\-8' | awk '{print "sudo supervisorctl start " $0"\n" }' > /tmp/restart.sh && sh /tmp/restart.sh 


批量调用 API

用文件里的数据填充 curl 里的占位符,生成命令内容。

bcurl.sh

#!/bin/bash
 
file=$1
while read line
do
    echo '\n\n'$line
    curl -H "Content-Type: x-www-form-urlencoded" -X POST -d '{"c_version":"1.0", "c_appid":"6015603dc50023fb55ba78c9379bb278", "c_action": "TiInfo", "key": "'$line'", "type":"ipIngress"}' http://127.0.0.1:9900/api/v1/
done < $file

sh bcurl.sh ips.txt

AI 来帮忙

如果你不熟悉 Shell ,也没关系,让 AI 来帮忙。 你只负责出题即可。

出题:

我有一个命令文件,每一行都是一个命令,写一个 linux 命令组合,读取文件里的每一个命令并执行。必须是能够在 shell 上单行输入的。

cmd.txt
ls -1 ~/ | wc -l
ls -1 ~/workspace | wc -l
ls -1 ~/joy | wc -l

AI 就会给出回复。然后尝试执行下即可。

你还可以添加更多要求:希望能输出每一行及对应的命令结果;并发执行这些命令等。

小结

如果把一个个 Linux 实用命令看作是一个 API, 那么组合这些实用命令完成实际任务,跟日常软件开发已经很接近了。

如果不想总是从字符开始写程序,那么学习 linux 命令,创建实用工具,倒也不失为一种乐趣。

标签:Shell,grep,指定,命令,awk,print,txt,技能
From: https://www.cnblogs.com/lovesqcc/p/18213501

相关文章

  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......
  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......
  • shell脚本的相关知识点
    shell脚本的相关知识本质:编程语言,shell命令的有序集合编译型语言    示例:C/C++   支持:编译器支持   效率:高解释型语言    示例:shell脚本,python,js   支持:命令解释器支持   效率:低   开始shell脚本编程    1.创建shell脚本文件,......
  • AI时代的Android程序员技能升级之路
    前言随着人工智能技术的飞速发展,我们正处在一个前所未有的技术变革时期。AI不仅改变了我们的生活方式,也深刻影响了软件开发的领域。在这个智能时代,Android程序员作为技术革新的先锋,必须不断学习和适应,以维持其在激烈竞争中的技术优势。AI技术的迅猛发展为程序员带来了双重......
  • Shell编程之条件语句
    一、条件测试操作        要使Shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等。      ......
  • Shell 编程规范与变量
    1. Shell脚本概述1.1Shell的作用Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。Shell解释器程序有很多种,使用不同......
  • 01-Shell 编程规范与变量
    Shell脚本概述:在一些复杂的Linux维护工作中,大量重复性的输入和交互操作不仅费时费力,而且容易出错,而编写一个恰到好处的Shell脚本程序,可以批量处理、自动化地完成一系列维护任务,大大减轻管理员的负担Shell的作用它介于操作系统内核与用户之间,充当了一个“命令解释器......
  • Shell编程规范与变量
    一:第一个shell脚本1:shell的作用[root@localhost~]#cat/etc/shells2:编写第一个shell脚本[root@localhost~]# vifirst.shcd/boot/pwdls-lhvml*[root@localhost~]#chmod+xfirst.sh[root@localhost~]#./first.sh[root@localhost~]#vifirst.s......
  • Shell编程完成用户注册登录
    目录需求1.menu界面welcome(1)注册用户(2)用户登录(3)退出2.注册用户(1)用户名(首字母大写)(2)密码(8位及其以上必须有三个字符其中一个以上如:&$_隐试密码)(3)手机号码(必须以139开头)(4)邮箱邮箱名数字开头@qq.com(5)检测是否重名,重手机号和邮箱(6)不重名、手机号、邮箱写入......
  • PowerShell 命令 Get-NetConnectionProfile 来查看当前网络连接的类型。命令会列出当
    PowerShell命令Get-NetConnectionProfile来查看当前网络连接的类型。在PowerShell中执行以下命令:powershellCopyCodeGet-NetConnectionProfile这个命令会列出当前计算机上所有网络连接的详细信息,包括连接名称、接入类型(例如“域网络”、“专用网络”、“公用网络”)等。在......