Linux shell笔记
[toc]
if…else
case
case "$variable" in
abc)
echo "\$variable = abc"
;;
xyc)
echo "\$variable = xyz"
;;
*)
echo "other word."
;;
esac
for
for file in /{,usr/}bin/*calc
do
if [ -x "$file" ]
then
echo $file
fi
done
Linux常用命令笔记
Awk
查看文本文件中指定列
awk -F',' '{print $1}' testtableone.csv
计算文本文件中指定列的总和
awk -F',' '{sum += $1} ;END {print sum}' testtableone.csv
awk -F',' 'BEGIN {sum=0} {sum+=$1} END {print sum}' testtableone.csv
计算文本文件中所有各列的总和
awk -F',' '{for(n=1;n<NF;n++) t[n]+=$n} END {for(n=1;n<NF;n++) print t[n]}' testtableone.csv
找出匹配到’L’的列的总和
awk -F',' '/L/ {sum += $1} ;END {print sum}' testtableone.csv
求平均值
awk -F',' '{sum += $1}; END {print sum/NR}' testtableone.csv
求最大值
awk -F',' 'BEGIN {max=0} {if( $1>max ) max=$1 fi} END {print max}' testtableone.csv
比较完整的一个例子
awk -F ',' 'BEGIN {sum=0 ;count=0}{if ($(NF-11) == 2 && $NF == 0 && $3 == "1.6.1_1_1") {sum +=$5; count++;} } END {print "sum="sum" count="count " avg="sum/count}'
说明:
- BEGIN{sum=0 ;count=0} 初始化计数器;
- END {print “sum=”sum” count=”count “ avg=”sum/count} 打印汇总,计数器和均值;
- if ($(NF-11) == 2 && $NF == 0 && $3 == “1.6.1_1_1”) {sum +=$5; count++;} 判断倒数第11个字段,判断倒数第一个字段,判断第三个字段(字符串) 第五个字段汇总累加,计数器累加
- $NF 可用来表示一个记录的最后一个栏位
- NF表示当前行的字段数,$0表示当前行
统计词频
cat words.txt | awk '{ for(i=1;i<=NF;i++){count[$i]++} } END { for(k in count) {print k" "count[k]} }' | sort -nrk 2
内容转置
awk '{
for (i=1;i<=NF;i++){
if (NR==1){
res[i]=$i
}
else{
res[i]=res[i]" "$i
}
}
}END{
for(j=1;j<=NF;j++){
print res[j]
}
}' file.txt
Cut
剪切文本文件中指定列的字段
cut testtabletwo.csv -f 1,3
剪切文本文件中指定范围的字段
cut testtabletwo.csv -f 1-3
cut testtabletwo.csv -f 1-
cut testtabletwo.csv -f -3
对文本文件基于指定分隔符进行切割
cut testtabletwo.csv -d':' -f 1,3
剪切未指定文本文件中的字段
cut testtabletwo.csv -f 1,3 --complement
指定输出分隔符
cut testtabletwo.csv -f 1,3 --output-delimiter '_'
获取主机所有用户的列表
getent passwd |cut -d ':' -f1
Sed
删除文本文件中的指定行
cat /etc/passwd | sed '2,5d'
替换文本文件中指定行的内容
cat /etc/passwd |sed '2,5c hahaha'
打印指定行并输出行号
cat -n /etc/passwd | sed -n '5,7p'
删除/etc/passwd 所有包含 root 的行,其他行输出
nl /etc/passwd | sed ‘/root/d’
搜索第一个bash并将起替换成blueshell然后退出
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'
多点编辑。
删除第三行及其之后的内容,并将bash替换成hahaha
nl /etc/passwd | sed -e '3,$d' -e 's/bash/hahaha/g'
多点编辑每条命令前都要加上-e
Grep
匹配整个单词
grep -w Adm testtabletwo.csv
显示不被pattern匹配到的行,相当于[^]反向匹配
grep -v Adm testtabletwo.csv
找出指定行的数据
grep -n "" file.txt | grep -w "10"|cut -d":" -f2
逻辑or匹配多个
两者之间是或
grep -e Adm -e Sal testtabletwo.csv
输出匹配的行数
grep Adm -c testtabletwo.csv
输出匹配行之前之后的内容
# 显示匹配行之后的内容
grep Adm -A2 testtabletwo.csv
# 显示匹配行之前的内容
grep Sal -B2 testtabletwo.csv
# 显示匹配行之前之后的内容
grep Adm -C2 testtabletwo.csv
找出匹配的电话号码
cat file.txt | grep -E '(^\(\d{3}\)\s|^\d{3}-)\d{3}-\d{4}$'
xargs
查询*.txt文件中包含abc的行记录
find -name '*.txt' |xargs grep "abc"
并发执行命令
docker ps -q | xargs -n 1 --max-procs 0 docker kill
find
查找大文件
寻找当前目录下大于100M的文件,并列出路径以及文件大小
find . -type f -size +100M -print0 | xargs -0 du -h
将上述结果排序
find . -type f -size +100M -print0 | xargs -0 du -h| sort -nrk 1
du
查找大目录
查找当前层级的目录大小
du -h --max-depth=1 |sort -n
找出根目录开始,最大的12个文件
du -hm --max-depth=2 | sort -nr |head -12