Linux速查笔记

shell以及常用命令

Posted by LANY on January 1, 2020

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