shell中的幾個常用命令
本文為[1]書中內(nèi)容簡要總結(jié)。
1 xargs
語法
command | xargs
xargs 將stdin接收到的命令重新格式化础嫡,然后再講解作為參數(shù)提供給其他命令。
將多行輸入變?yōu)閱涡?/p>
cat example.txt | xargs
將單行變多行
cat example.txt | xargs -n 3
每行三個元素
定界符分隔參數(shù)
echo "splitXsplitXsplitXsplitX" | xargs -d X
(2)結(jié)合find使用xargs
find . -type f -name "*.txt" -print0 | xargs =o rm -f
xargs -0 將\0當作輸入定界符
2 sed
(1)sed可以替換給定文本中的字符串酝惧,利用正則表達式匹配
sed 's/pattern/replace_string/' file
將結(jié)果直接應(yīng)用于原文件
sed 's/text/replace/' file > newfile
mv newfile file
或者
sed -i 's/text/replace/' file
替換所有內(nèi)容榴鼎,我們需要在命令行尾部加入/g
sed 's/pattern/replace_string/g' file
有時候我們不需要替換前N-1處匹配,二是需要替換剩下的匹配晚唇。
echo this thisthisthis | sed 's/this/THIS/2g'
Mac 下命令有誤巫财,ubuntu可以,可能我用的shell不同
(2)移出空白行
sed '/^$/d' file
/pattern/d 會移出匹配樣式的行
(3)已匹配字符串標記&
echo this is an example | sed 's/\w\+/[&]/g'
(4)子串匹配標記\1
echo this is digit 7 in number | sed 's/digit \([0-9]\)/\1/'
(5)引用
text=hello
echo hello world | sed "s/$text/HELLO/"
sed表達式中引用變量字符串的時候缺亮,可以使用雙引號
3 awk
(1)awk腳本的結(jié)構(gòu)基本如下所示:
awk ' BEGIN{ print "start" } pattern {commands} END{print "END"}'
file
(2)awk命令的工作方式如下:
- 執(zhí)行
BEGIN{ commands }
語塊中的語句翁涤。 - 從文件或者stdin中讀取一行,然后執(zhí)行
pattern { commands }
萌踱。重復(fù)這個過程葵礼,直到文件全部讀取完畢。 - 當讀至輸入流末尾時并鸵,執(zhí)行
END { commands }
語句塊鸳粉。
例子: 統(tǒng)計代碼
find ~/Documents/Python/MxShop-master -type f -name "*.py" -print0 | xargs -0 wc -l | awk '{sum+=$1}END{print sum}'
64540
(3) 特殊變量
NR: 表示記錄數(shù)量,在執(zhí)行過程中相當于當前行號
NF: 表示字段數(shù)量园担,在執(zhí)行過程中相當于當前行的字段數(shù)
$0: 這個變量包含執(zhí)行過程中當前行的文本內(nèi)容
$1: 這個變量包含執(zhí)行過程中第一個字段(第一列)的文本內(nèi)容
$2: 這個變量包含執(zhí)行過程中第二個字段(第二列)的文本內(nèi)容
例子:
echo -e "line1 f2 f3 \nline2 f4 f5 \nline3 f6 f7" | \
awk '{print "Line no:" NR ", No of fields:" NF, "$0=" $0, "$1=" $1, "$2=" $2, "$3=" $3}'
打印每一行的第2和第3個字段:
awk '{ print $3,$2 }' file
統(tǒng)計文件中的行數(shù):
awk 'END {print NR}' file
(4)將外部變量值傳遞給awk
當輸入來自于文件的時候
awk '{print v1,v2 }' v1=$var1,v2=$var2 filename
(5)用geline讀取行
grep 默認讀取一個文件中的所有行届谈,如果只想讀取某一行枯夜,可以使用getline函數(shù)讀取某一行,有時候我們需要從BEGIN語句中讀取第一行
seq 5 | awk 'BEGIN {getline; print "Read ahead first line", $0} {print $0}'
(6)用樣式對awk處理的行進行過濾
awk 'NR<5'
awk 'NR==1,NR==4'
awk '/linux/'
awk '1/linux/'
(7)設(shè)置字段定界符
默認的字段定界符是空格
awk -F: '{ print $NF }' /etc/passwd
awk '{BEGIN{FS=":"} print $NF }' /etc/passwd
(8)在awk中使用循環(huán)
awk 'BEGIN {for(i=0;i<10;i++) print i}'
awk 'BEGIN {for(i in array) print i}'
4 grep
(1)語法
grep match_pattern filename
使用正則表達式的時候可以
grep -E "[a-z]+"
egrep "[a-z]+"
只輸出匹配到的行:
echo this is a line. | grep -o -E "[a-z]+\."
echo this is a line. | grep -o "[a-z]+\."
統(tǒng)計文件中匹配字符串的行數(shù)
grep -c "text" filename
打印包含匹配字符串的行數(shù)
grep linux -n sample1.txt sample2.txt
打印樣式匹配所位于的字符或字節(jié)偏移:
echo gnu is not unix | grep -b -o "not"
找出匹配文本位于哪一個文件中
grep -l linux sample1.txt sample2.txt
(2)遞歸搜索
grep "test_function()" . -R -n
(3)忽略樣式中的大小寫
echo hello world | grep -i "HELLO"
(4)grep 匹配多個樣式
grep -e "pattern1" -e "pattern2"
(5)grep 搜索中包括或排除文件
grep "main" . -r --include *.{c,cpp}
(6)打印出匹配文本之前或者之后的行
之后幾行
seq 10 | grep 5 -A 3
之后幾前
seq 10 | grep 5 -B 3
之前之后幾行
seq 10 | grep 5 -C 3
[1]Linux Shell 腳本攻略