Shell笔记

本文详细介绍Shell脚本的应用,包括定时任务设置、环境变量配置、文本处理命令如grep、awk与xargs的使用技巧,并提供了实用的示例。

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

较全的资料

shell命令详细解析

定时脚本任务

参考:crontab命令详解

主要用到: crontab -e 命令
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

在每个整点的第五分钟执行,如下

# submit hadoop static job per hour 
5 * * * * sh /dir/vitamin/code/datapreprocessing/task8/submit_hour.sh

Shell 循环、时间、变量、大小等

参考:Shell 基本运算符

export JAVA_HOME=/data6/dir/client_pkg/jdk1.7.0_51
export JRE_HOME=$JAVA_HOME/jre
export HADOOP_PREFIX=/data6/dir/client_pkg/hadoop-2.5.1
export HADOOP_CLASSPATH="./:$JAVA_HOME/lib:$JRE_HOME/lib:/usr/share/java:$HADOOP_PREFIX/lib/native"
export PATH="$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/tool"


feature_id=6449972
local_ip=$(LANG=C /sbin/ifconfig eth1 | grep "inet addr" | awk '{print $2}' | awk -F: '{print $2}')
local_dir=/XXX/vitamin/code/datapreprocessing/task8

day=`date +%Y%m%d -d "${1}"`
datetime=`date "+%Y%m%d %H:00:00" -d "${1}"`
cur_time=${datetime}
end_date=`date "+%Y%m%d" -d "${1} 4 days ago"`
proj_name="dir"
model_name="recommend_recall_reason_static_ctr_hour"
pre_dir=/user/dir/thinkerguo/proj/dir
cur_date=`date +%Y%m%d -d "${1}"`
cd $local_dir

while [ $cur_date -ge $end_date ]
do
    day_str=`date +%Y_%m_%d -d "${cur_date}"`
    cf0=`date +%Y%m%d_%H -d "${datetime} 1 hour ago"`
    cf1=`date +%Y%m%d_%H -d "${datetime}"`
    cf2=`date +%Y%m%d_%H -d "${datetime} 1 hour"`
    cf3=`date +%Y%m%d_%H -d "${datetime} 2 hours"`
    showlog=${pre_dir}/showlog5min/${cur_date}
    omgslog=/user/dir/dir/dir/showlog/${day_str}
    clicklog=/user/dir/dir/dir/clicklog
    out=${pre_dir}/static/reason_hour/${model_name}_${cf1}
    sf=kb_slog_${cf0}
    $HADOOP_PREFIX/tool/submit_v_sh -b dir -u user  -s ./ -f ./log/${day_str}.log -c "${day} ${clicklog} ${showlog} ${omgslog} ${out} ${sf} ${cf0} ${cf1} ${cf2} ${cf3}" > ./log.txt 2>&1
    datetime=`date "+%Y%m%d %H:00:00" -d "${datetime} 1 hour ago"`
    cur_date=`date +%Y%m%d -d "${datetime}"`
done

shell文本处理命令:

shell命令大全
linux学习:xargs与grep用法整理

1.grep:命令用法:

1.1在一个目录下所有文档或指定文档查找 指定字符串
grep object_str dir
grep object_str filename
grep object_str filenameprex*
1.2匹配模式:

在下面的文本中匹配指定的模式的文本

文本:part-xx
868551028676362 10OUORJ6F2000J1S0   WB  0_100.65.9.87
868551028676362 c   10OUORJ6F2000J1S0
868551028676362 o   10OUORJ6F2000J1S0   532926471392944776
shell命令:以下两个命令分别匹配第2行和第3行
grep -P '\tc\t' part-* >click.res
grep -P "\to\t" part-* >show.o.res

2.结合xargs 进行高级的文本任务:

2.1为什么要用xargs:

xargs的原理剖析及用法详解
管道实现的是将前面的stdout作为后面的stdin,但是有些命令不接受管道的传递方式,最常见的就是ls命令。有些时候命令希望管道传递的是参数,但是直接用管道有时无法传递到命令的参数位,这时候需要xargs,xargs实现的是将管道传输过来的stdin进行处理然后传递到命令的参数位上。也就是说xargs完成了两个行为:处理管道传输过来的stdin;将处理后的传递到正确的位置上。

2.2实例xargs -i:

xargs -i选项在逻辑上用于接收传递的分批结果。
如果不使用-i,则默认是将分割后处理后的结果整体传递到命令的最尾部。但是有时候需要传递到多个位置,不使用-i就不知道传递到哪个位置了。使用xargs -i时以大括号{}作为替换符号,传递的时候看到{}就将被结果替换。可以将{}放在任意需要传递的参数位上,如果多个地方使用{}就实现了多个传递。

2.2.1例子:

下例实现把click.res.pure中的记录的每一行发到后面,取代{},并把grep的结果发送到vitmain文件中(没有就创建,有就直接加在后面)

cat click.res.pure | xargs -i grep {} show.res.pure > vitamin
2.2.2把过滤的结果计数后输出并显示wc命令

wc命令详解
Linux wc命令用于计算字数。
利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为”-“,则wc指令会从标准输入设备读取数据。
参数:
-c或–bytes或–chars 只显示Bytes数。
-l或–lines 只显示列数。
-w或–words 只显示字数。
–help 在线帮助。
–version 显示版本信息。
语法

wc [-clw][--help][--version][文件...]
cat click.res.pure | xargs -i grep {} show.res.pure | wc -l

3.awk命令:

AWK文本分析命令

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo

#把这样的文本:
click.res:part-m-00120:865086034785009  c   10OUQ73EF1000IZE0‘’
处理得到
865086034785009,10OUQ73EF1000IZE0
awk -F "\t" 'BEGIN{OFS=","}{print $1,$3}' click.res | awk -F ":" '{print $2}'

4.批量替换多个文件中的字符串

find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
利用正则表达式批量替换当前目录下的json文件中的字符串
find -name '*.json' | xargs perl -pi -e 's|/mnt/sda4/CODING/python/kaggle_data|/home/bigdata/disk/data/seizure-prediction/kaggle_data|g'

重定向

参考链接
在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:
0: Standard Input (STDIN)
1: Standard Output (STDOUT)
2: Standard Error Output (STDERR)

在标准情况下, 这些FD分别跟如下设备关联:
stdin(0): keyboard 键盘输入,并返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端

目录下只有a.txt
#执行后,没有任何返回值. 原因是, 返回值都重定向到相应的文件中了,而不再前端显示 
ls a.txt b.txt  1>file.out 2>file.err 
#一般来说, "1>" 通常可以省略成 ">". 
#"1>&2"正确返回值传递给2输出通道 &2表示2输出通道
ls a.txt b.txt 1>file.out 2>&1
正确和错误的结果 都输出到file.out文件中。
一般应用于需要保持日志:
python命令
python run.py >log.txt &

shell命令
./run.sh >out.txt 2>&1 &

nohup命令详解

参考链接

### 超哥 Shell 编程笔记与教程 超哥的 Shell 编程笔记主要聚焦于基础概念、特殊变量以及子串操作等内容[^1]。以下是一些关键点: #### 一、Shell 编程基础 在 Shell 编程中,特殊变量是理解脚本逻辑的核心部分之一。例如 `$0` 表示脚本名称,`$1` 到 `$n` 表示传递给脚本的参数,而 `$$` 则表示当前进程的 PID[^3]。 #### 二、子壳(Subshell)行为 子壳的行为需要注意,其内部定义的变量无法被父壳访问。此外,当退出子壳时,会按照嵌套层次逐步退出,类似于嵌套的 `for` 循环结构中的 `break` 操作[^2]。 #### 三、循环控制语句 以一个简单的 `for` 循环为例,可以使用 `continue` 或 `break` 来控制循环流程。例如,在下面的代码中,当变量 `i` 等于 4 时,跳过当前循环并继续执行下一次循环: ```bash #!/bin/bash # 演示 continue 的用法 for (( i=1; i<=10; i=i+1 )) # 循环十次 do if [ "$i" -eq 4 ]; then # 如果变量 i 的值等于 4 continue # 跳过本次循环 fi echo $i # 输出变量 i 的值 done ``` 上述代码展示了如何通过条件判断来改变循环的行为[^3]。 #### 四、文件遍历 在实际应用中,Shell 脚本常用于文件或目录的遍历操作。以下是一个遍历指定路径下的文件并输出其路径的示例: ```bash #!/bin/bash # 遍历 /home/user 开头的路径 for file in /home/user* do if [ -f "$file" ]; then # 判断是否为文件 echo "File: $file" elif [ -d "$file" ]; then # 判断是否为目录 echo "Directory: $file" fi done ``` 这段代码结合了 `-f` 和 `-d` 测试选项,分别检查变量 `$file` 是否为文件或目录[^4]。 #### 五、系统命令集成 如果需要将脚本作为系统命令运行,可以将其放置在系统的可执行路径中(如 `/bin` 或 `/sbin` 目录)。这样可以通过简单的命令名直接调用脚本[^2]。 ### 总结 超哥的 Shell 编程笔记提供了从基础到实践的全面指导,包括特殊变量、子壳行为、循环控制以及文件遍历等内容。这些知识点对于初学者和进阶用户都具有很高的参考价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值