有意思的记录-shell(持续更新)
1.統計重復行的個數
sort uid.txt | uniq -c2.查看壓縮文件
cat *.gz | gunzip > 1233.查看2個文件的交集、差集
comm用于比較兩個有序文件,默認第一列為第一個文件獨有的元素,第二列為第二個文件獨有的元素,第三列為共有元素,語法:comm 選項 參數
-1:不顯示在第一個文件出現的內容
-2:不顯示在第二個文件出現的內容
-3:不顯示同時在兩個文件中都出現的內容
comm <(sort 1.txt| uniq) <(sort 2.txt | uniq)grep -F -f 1.txt 2.txt | sort | uniq
兩者交集,-F以行為單位進行查找,-f指明1.txt內容為要查找的pattern。
?grep -F -v -f 2.txt 1.txt | sort | uniq
-v顯示查找不到的元素,即1.txt獨有的元素(1.txt-2.txt)
4.sed使用
替換一個目錄下所有文件中的某個pattern:
sed -i "s/pattern/newstr/g" `grep pattern -rl ./*`將pattern替換為newstr
整行替換:
?sed -i 's/^flag.*$/flag : 0/g' file_name
將以flag開頭的行替換為flag : 0
刪除特定行:
sed -i '/^列王的紛爭/d' test1
刪除以列王的紛爭開頭的行
sed -n '2,$p' test.txt
打印test.txt的第二行到最后一行,$意為最后一行。-n表示不打印編輯行,不帶n,每行會被打印2次。?
5.算數計算
expr/$(())只能用于整數的計算,浮點的計算可以使用awk,bc
nn=`echo $linenum | awk '{print $1 * 0.01}'`awk求列和:
awk -F"\t" 'BEGIN{total=0}{total+=$1}END{print total}'6.find使用
find . -name '*.txt'查找當前目錄下所有子目錄下txt類型的文件
nice -n 19 ionice -nr6 find buslog.* -type f -mtime +$i -delete -print >> days_rm_log.log 2>&1刪除某些過期文件:mtime 表示最后修改時間,i表示第幾天,可以用個循環,刪除以前的多少天記錄;nice/ionice用于命令降級,以免影響其他服務
查找文件,找到后并進行其他操作。格式為:
find path 參數 pattern -exec 命令
find cache_log -name cache_log_*.log -exec rm -rf {} \; find rotate_group_log -name rotate_group.log -exec mv {} rotate_group_log/rotate_group.log.$yesterday \;其中{}是find命令的結果,用于輸入參數傳入下一命令;但是每個命令都要以\;結束
7.查看端口占用進程
netstat -anp | grep port lsof -i :porta:顯示所有套接口;n:顯示網絡ip;p:顯示pid和進程名
查看占用端口port的進程
lsof -p pid | grep IPv4 lsof -i | grep pid以上2條命令都用于查看進程pid打開的網絡連接
8.進程間通信查看
ipcs(interprocess communication facilities status):展示共享內存(-m)、信號量(-s)、消息隊列信息(-q)
ipcrm(remove an XSI message queue, semaphore set, or shared memory segment identifier)
ipcrm [ -q msgid | -Q msgkey | -s semid | -S semkey | -m shmid | -M shmkey ]10.查找某進程
ps -eo cmd | grep -x "bin/test" 根據執行命令查找進程是否存活,避免根據名字查找的不規范。-x整行匹配, ps -eo只顯示cmd11.shell讀文件
k=1 while read line;doecho "Line # $k: $line"((k++)) done < $FILE echo "Total number of lines in file: $k"12.sort
sort -k3 -nr app_downinfo2015-06-02.txt > app_sort 文件按空格分割,第三列按照降序排列sort -t $'\t' -k2,2 down_0722_uniq 分隔符指定為tab,按第二列排序
13.隨機抽取若干行
awk 'BEGIN{srand();while (n<500){num=int(rand()*30546)+1;if (!(num in a)) {a[num]=1;n++}}}NR in a' game_similar.txt > training_data.txt game_similar.txt共30546行,從中隨機選擇500行14.日期
日期轉換為時間戳 date +%s date -d '2015-07-30 20:05:02' +%s 分別獲得對應的時間戳1438257971、1438257902時間戳轉化為日期,如下獲得2015-07-30 20:05:02 date -d @1438257902 +"%Y-%m-%d %H:%M:%S"
日期加減
#20150816 date -d '-30 days' +%Y%m%d #20150914 date -d 'yesterday' +%Y%m%d #20150914 date -d '-1 day' +%Y%m%d #20150916 date -d '+1 day' +%Y%m%d15.xargs
將前面的參數列表,一行一行的傳給后面的命令 cat test.txt | xargs -i date -d @{} +"%Y-%m-%d %H:%M:%S" 把test.txt里每行的時間戳轉化為日期,-i 選項告訴 xargs 用每項的名稱替換 {},如果參數是在命令最后面的就不需要-i,如rm 查找某路徑下的文件內容 find . -name "*.xml" | xargs grep "hadoop.tmp.dir"16.awk獲取shell外部變量
a=300 awk -v b=$a 'BEGIN{print b}'17.正則表達式提取
從log中提取versionCode字段 grep -Eo "versionCode=[0-9]+" msearchgame.log18.shell for循環
#1到10 for i in `seq 10` do done #靜態語言用法 for ((i=1; i<= 10; ++i)) do done #for in for i in {1..10} do done19. 字符串比較
[ ] 是條件判斷,–eq/–ne/-gt/-ge/–lt/-le用于整數的比較,那浮點數和字符串的比較呢?、 #1.轉義的比較符 \< \> [ 'a' \< 'b' ] && echo 'ok' [ 'abc' \> 'a' ] && echo 'ok' #2.雙括號[[ ]] [[ 'a' < 'b' ]] && echo 'ok' [[ 'abc' > 'a' ]] && echo 'ok' [[ 3.5 < 7.6 ]] && echo 'ok' #字符串包含判斷,是否包含wo [[ 'hello word' =~ wo ]] && echo 'ok'20.awk正則表達式
awk '$0 ~ /^[1-9]/' subject打印以數字開頭的行
21.awk去重
$0做為下標,沒有出現的時候a[$0]為0,出現一次后就會+1
awk '{if(! a[$0]++){print $0}}'轉載于:https://www.cnblogs.com/whuqin/archive/2012/08/23/4982037.html
總結
以上是生活随笔為你收集整理的有意思的记录-shell(持续更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj--2019 Cornfields
- 下一篇: 【推荐软件】wingrep