shell练习(grep,sed,awk,距离生日天数的计算,累加求和,文件操作和文本操作)

2023-09-21 11:04:44

最近在学习shell脚本编写,把几个练习记录一下。包括grep,sed,awk,距离生日天数的计算,累加求和,文件操作和文本操作。

grep相关练习

找到/huiluczp下含有星号的文件与内容,主要是利用find来找到所有待查的文件作为参数给grep

echo '找到/huiluczp下含有星号的文件与内容'
grep '\*' $( find /home/huiluczp/huiluczp -type f )

找到所有目录下所有含有星号的文件名,并使用xargs来进行优化。太长的命令无法执行,使用xargs每十个文件执行一次。

echo 'xargs优化查询'
find /home/huiluczp -type f | xargs -n 10 grep -l '\*'

设置myip新命令来拿到本机的ip,使用awksed两种方式。要注意的是和直接输出不同,在alias的时候awk需要对$进行转义。sed的主要思路是将ip字段前后的字符串全部变为空,即可得到ip字段。

ifconfig eth0 | grep 'inet ' | awk '{print $2}'
alias myip="ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'"
myip
alias myipawk="ifconfig eth0 | grep 'inet ' | awk '{print \$2}'"
myipawk

/home/huiluczp下面只要含有XYZ字符中的任何一个字符就列出来,简单正则使用。

grep '[XYZ]' $( find /home/huiluczp -type f )

去除开头为#的行,去除空白行,取出开头为英文的行,统计最终行数。对行做处理sed比较方便。

cat /home/huiluczp/huiluczp/text.txt | sed 's/^#.*$//g'
cat /home/huiluczp/huiluczp/text.txt | sed 's/^#.*$//g' | sed 's/\n//g' | sed '/^$/d'
cat /home/huiluczp/huiluczp/text.txt | sed 's/^#.*$//g' | sed 's/\n//g' | sed '/^$/d' | grep '^[A-Z,a-z]'
cat /home/huiluczp/huiluczp/text.txt | sed 's/^#.*$//g' | sed 's/\n//g' | sed '/^$/d' | grep '^[A-Z,a-z]' | wc -l

输出目前身份和当前目录

简单用whoamipwd即可

echo "当前身份为:$(whoami)"
echo "当前目录为:$(pwd)"

计算离生日还有几天

首先read用户输入,并利用正则去判断生日输入格式的正确性。

#!/bin/bash

# 输入生日日期
read -p "输入生日日期, 格式为mm-dd:" birthday
echo ${birthday}

# 简单判断是否为dd-dd格式
check_date=$( echo ${birthday} | grep '[0-9]\{2\}-[0-9]\{2\}' )
if [ -z check_date ];
    then
        echo "格式错误"
        exit 1
fi

考虑特殊情况,利用date拼接当天日期,字符串相同直接输出

# 特殊情况,如果正好是当天,那么输出提示
if [ "$(date +%m)-$(date +%d)" == "${birthday}" ];
    then
        echo "今天就是生日!"
        exit 1
fi

利用%s获取秒数,--date参数中将生日和当前年份进行组合,得到今年生日和今天间的秒数差值。

# 计算日期,如果当年还未到,那么直接取差值
date_now=$(date +%s)
year_now=$(date +%Y)
date_birthday=$(date --date="${year_now}-${birthday}" +%s)
date_diff=$((${date_birthday}-${date_now}))

echo ${date_diff}

考虑今年生日过了与否,通过秒数差值进行计算。当今年生日已过时,year+1计算下一年的生日和今天的差值。

if [ "${date_diff}" -lt "0" ];
    then 
        date_birthday=$(date --date="$((${year_now}+1))-${birthday}" +%s)
        date_diff=$((${date_birthday}-${date_now}))
        # echo ${date_diff}
fi

最后利用秒数转成天数,注意向上+1。

# 将差值转换为天数
remain_day=$((${date_diff}/24/60/60))
echo "当前时间为: $(date +%Y)-$(date +%m)-$(date +%d)"
# 有小数向上
echo "离下次生日还剩$((${remain_day}+1))天"
exit 0

累加求和

用户输入数字进行循环累加。简化了没进行数字合法性判断。

#!/bin/bash

read -p '输入一个大于1的数字:' input_num

sum=0
for (( i=1; i<=${input_num}; i=i+1 ))
do
    sum=$((${sum}+${i}))
done

echo "最后结果为${sum}"
exit 0

文件操作

判断是否存在,不存在则创建文件;存在且为目录文件,删除。存在且为文件,删除后创建同名目录。主要是判断式,删除命令和创建命令的使用。

#!/bin/bash

file_name=/home/huiluczp/huiluczp/logical

# 判断是否有/home/huiluczp/huiluczp/logical存在
if [ ! -e "${file_name}" ];
then
    # 不存在则创建文件
    echo "创建文件${file_name}"
    touch ${file_name}
else
    # 存在且为file,则删除后创建目录
    if [ -f "${file_name}" ];
    then
        echo "存在文件${file_name}, 删除后创建目录"
        rm ${file_name}
        echo "${file_name}文件已删除"
        mkdir ${file_name}
        echo "${file_name}目录已创建"
    # 存在且为dir,删除目录
    elif [ -d "${file_name}" ]
    then 
        echo "存在目录${file_name}, 删除该目录"
        rmdir ${file_name}
    fi
fi
exit 0

文本操作 /etc/passwd

/etc/passwd中的用户名称全部取出,并以The <行号> account is <用户名>的格式进行输出。用awk并且搭配FS(间隔符)和NR(行号)能比较方便地进行处理。

#!/bin/bash

pass_file=/etc/passwd

# 将文件中的第一行拿出来,转成The ${line_num} account is ${user}
cat pass_file | awk 'BEGIN {FS=":"} {print "The",NR,"account is",$1}'

总结

shell脚本写起来有些语法挺别扭的,包括各种引号的使用,转义字符等,调了还蛮久。还有就是ubuntu默认shell不是bash,所以要用c格式的语法得手动进行注释。脚本用熟练了就还好,还是得多练习。

更多推荐

Vue学习笔记总结

目录1、Vue核心1.1什么是vue?1.2什么是mvvm?​编辑1.3插值表达式{{}}2.Vue中的常用指令2.1内容渲染指令2.2条件渲染指令2.3事件绑定指令2.4属性绑定指令2.5列表渲染指令2.5.1小案例-小黑的书架2.6v-for中的key2.7双向绑定指令3.指令修饰符3.1什么是指令修饰符?3.2按

esbuild中文文档-基础配置项(General options - Tsconfig、Tsconfig raw)

文章目录TsconfigTsconfigraw结语哈喽,大家好!我是「励志前端小黑哥」,我带着最新发布的文章又来了!老规矩,小手动起来~点赞关注不迷路!esbuild简单介绍esbuild为了突破了JavaScript语言的瓶颈,采用了Go语言编写,构建速度与同代码量下的webpack对比提升在10倍以上,开创了构建工

(并查集) 1971. 寻找图中是否存在路径 ——【Leetcode每日一题】

❓1971.寻找图中是否存在路径难度:简单有一个具有n个顶点的双向图,其中每个顶点标记从0到n-1(包含0和n-1)。图中的边用一个二维整数数组edges表示,其中edges[i]=[ui,vi]表示顶点ui和顶点vi之间的双向边。每个顶点对由最多一条边连接,并且没有顶点存在与自身相连的边。请你确定是否存在从顶点sou

为何学linux及用处

目前企业使用的操作系统无非就是国产类的,windows和linux类。我们要提升自己的技能,需要学习这两款。我记得在大学时期,学习过windows以及linux,但当时觉得又不常用,就学的模棱两可。毕业之后,你会发现,其实这两种操作系统是很主流的。为什么学?下面就是一些工作中遇到的例子分享一下。我记得在企业中有次遇到数

一款固定资产设备管理系统、对常用资产设备进行信息化管理

一、开源项目简介EAM固定资产设备管理系统,满足中小企业基本需求,对常用资产设备进行信息化管理,包含自定义支持各类设备、自带导入导出、维护工作统计、采购管理、文档管理、合同管理等功能。实现企业对资产的基本管理,包含对资产的登记、维修、调拨、转移等基本功能的支持,并提供对资产的耗材、库存进行管理,有完善的组织架构,非常适

2023/09/17

文章目录1.vscode展开所有代码快捷键ctrl+k+j2.git删除所有stash或指定stashgitstashdrop[可选stash名]3.vue在函数默认参数后增加新参数4.gitpush添加“-u”参数5.vscode快捷输入符号$的使用6.WebGL之什么是GLB&GLTF文件?7.WebGL之什么是H

Appium混合页面点击方法tap的使用

原生应用开发,是在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开发;HTML5(h5)应用开发,是利用Web技术进行的App开发。目前,市面上很多app都是原生和h5混合开发,这样做的好处在于:1)开发效率高,节约时间同一套代码Android和IOS基本都可用。2)更新和部署比

SpringMVC之JSON返回及异常处理

目录JSON处理导入依赖配置Spring-mvc.xml@ResponseBody注解使用测试目录JSON处理导入依赖配置Spring-mvc.xml@ResponseBody注解使用测试Jackson定义用法常用注解统一异常处理为什么要全局异常处理?异常处理思路SpringMVC异常分类综合案例异常处理方式一异常处理

Call短路触发版本SIP对讲求助终端

SV-2701VPCall短路触发版本SIP对讲求助终端一、描述SV-2701VP是我司的一款壁挂式求助对讲终端,具有10/100M以太网接口,支持G.711与G.722音频解码,其接收SIP网络的音频数据,实时解码播放。配置一路线路输入,一路线路输出,可将内部音源输出到外接功放,还有Mic输入,一路继电器输出和一路呼

Python 3.11的10个高效新特性

1、模式匹配Python3.11引入了模式匹配,可以简化复杂的条件逻辑。下面是一个使用模式匹配来处理不同类型数据结构的例子:defprocess_data(data):matchdata:case0:print("Receivedzero")case[x,y]:print(f"Receivedalist:{x},{y}

基于Qt5的计算器设计

Qt5的信号与槽✨描述:信号槽是Qt框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信

热文推荐