linux命令行文本处理与一些命令参考

本文深入探讨Shell脚本的基础知识与高级技巧,包括字符串匹配、多选、逐行读取文本等实用功能,同时介绍了ps、sed、cal、find等常用命令的实战应用,适合初学者和进阶用户提升技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拆分列输出

ps输出一系列的文本,取出第2列

  • ps -ef|head -5 |tr -s " "|cut -d " " -f 2|grep -v “PID”
    tr -s可以将多个空格变成一个空格,cut选择第二列,grep -v 去除包含PID的行
  • awk相当于是tr和cut的结合体
    ps -ef|head -5 |awk ‘{print $2}’ |grep -v “PID”
  • 其实对于这个问题,ps是有对应的选项的
    ps -e --no-headers -o pid|head -4

替换字符

上面使用tr替换字符,而sed可以利用正则表达式来进行更强大的匹配替换
比如上面最后例子中的文本输出前面有一串空格,将其匹配出来并替换为空

ps -e --no-headers -o pid|head -4|sed "s/^ *//"/

shell脚本

  • set -x 显示每一行 set +x取消显示

引号

" "双引号中变量可以替换,单引号不可以

如果传递的变量中有*或?的文件通配符时,会按照路径展开。加上引号可以避免展开

message="Hello*"
echo $message

双引号中嵌套使用双引号时,使用\转义。
单引号中无法嵌套使用单引号,需要单独转义

$?最近一条命令的返回值$@为命令参数,shift可以移动位置参数

$()可以将命令输出为字符串,``也可以实现同样的效果

$(())可以进行数值运算

select多选

PS3="question"
select item in${menu[@]}; do
	echo "$item"
done

逐行读取文本

xxx.sh target < test.txt
#script
while read server; do
	echo "$server $@"&#后台执行
done
wait#等待所有命令执行完成

可以在while中指定读入脚本

xxx.sh test.txt target
#script
file =$1
shift
while read server; do
	echo "$server $@"&#后台执行
done<"$file"
wait#等待所有命令执行完成

makefile

在每行前面加上@可以避免输出对应行命令

tee输出文本文件同时进行管道输出

TMPFILE=/tmp/xxx.log.$$ #$$ 记录pid的值,利用这个变量避免文件名重复
{#可以书写多条命令
	echo "date :$(date)"
	mount -o rw,remount /dev/sda
	mount -o ro,remount /dev/sda
}2>&1|tee $TMPFILE|logger -t "mountlog"
rm $TMPFILE
  • iconv可以实现编码转换
  • mail可以发送邮件

shell字符串匹配

?匹配单个字符,*匹配任意内容,[0-9]在中括号内的内容匹配一个
详细介绍
比如希望将某个文件夹中的runxxxx变成run0000xxxx,利用makefile进行匹配并执行软链接操作,只需要make extend 即可制作所有软链接

.PHONY: extend split
target:=$(wildcard run????)
extend: $(target:run%=run0000%)

run0000%: run%
        echo $@
        ln -s $^ $@

利用Makefile和shell脚本将文件夹中的文件分类,并分别建立到不同文件夹的软链接

0000%: 
        mkdir -p run$@
        for root in $(wildcard run2092-2103/Jinping_1ton_Phy_20??????_0000$**.root);do echo $${root};ln -s $${root} run$@/$$(basename $${root}); done

其中利用了Makefile的二级展开$$

cal

参考

cal [options] [[[day] month] year]
cal [options] [timestamp|monthname]

cal 显示日历,如未指定参数,显示当月的日历。

一共有两种历法可以使用,Gregorian(格里高历)和Julian(儒略历)。Gregorian在闰年的设置上有跳跃(注:此处指的是Gregorian在被100整除的年份不设置闰年),使得和太阳运行周期更为匹配。

默认情况下cal使用1752年9月3日作为Gregorian的采用时间,此后的日历采用形式使用Gregorian,之前的形式使用Julian。
(注:注意到跳变的日期,11天被移除

$ cal  9 1752
   September 1752
Su Mo Tu We Th Fr Sa
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

)
使用--reform参数来指定仅使用某一种日历形式。
(注: 此处的--reform参数在bash命令行中没有找到,bash中对应的另外一个命令是

$ ncal -J 9 1752
    September 1752
Su     6 13 20 27
Mo     7 14 21 28
Tu  1  8 15 22 29
We  2  9 16 23 30
Th  3 10 17 24
Fr  4 11 18 25
Sa  5 12 19 26

)
警告
-j
使用序列数字来展示日期,从1月1日开始计数。但并不意味着这个选项使用了Julian日历系统。

find

参考: Debian manual

find  [-H]  [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
  • -H,-L,-P:指定对符号链接的搜索方式,
    -D:指定debug模式,
    -O:指定查询优化级别
    上述参数详细查询manual

  • starting-point可以指定搜索开始的目录

  • expression是find功能部分,由以下几部分构成

    • Tests返回True,False,非常重要的一部分,基本上是find功能的主要实现位置
      +n:大于某个数
      -amin n: n分钟前的时刻接触过,当然可以改为-amin +n表示n分钟以前的任何时候接触过,注意两者区别在于前者是某个指定的分钟,后者是某分钟以前
      perm:权限
      size:大小
      -regex patter:正则表达式提供了更强大的检索功能
      等等其它关于文件属性的判断

    • Action执行命令
      -exec command ; :对每一个符合条件的文件执行操作

      	find . -amin +5 -exec ls -l '{}' \;
      

      -exec command {} + :将符合条件的文件作为参数执行一次操作

      find . -amin +5 -exec ls -l '{}' +
      
    • Global options指定全局参数
      -depth指定查询深度
      -maxdepth指定最大查询深度
      等等

    • Positional option仅影响跟随其后的Test和·Action
      -daystart

    • Operators将其它选项连接起来

实战例子

  • xxx路径有很多文件夹,里面有文件,需要删除包含yyy.fail文件的文件夹。解决方式可以利用find
find xxx -name "*.fail"  -exec dirname {} \;|sort -u|xargs rm -r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

greatofdream

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

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

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

打赏作者

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

抵扣说明:

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

余额充值