Shell筆記

較全的資料

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命令詳解

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章