printf "%-5s %-10s %-4s\n" No Name Mark

printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456

%-5s知名了一个格式为左对齐且宽度为5的字符串替换(-表示左对齐)


pgrep -f wechat 查找有wechat的pid


var="hello"

echo $var和echo ${var} 一样

获得变量值的长度:

var='123456789012345!@#$'

echo ${#var}    #19

echo $0 显示用的什么shell

-bash

echo $SHELL 显示用的什么shell

/bin/bash

echo $UID 显示当前的用户id

0


使用函数添加环境变量

prepend() { [ -d $2 ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ;}

使用方式:

prepend PATH /opt/myapp/bin


使用shell进行数学运算

在 bash shell 中 ,使用 let (( )) 和 [ ] 执行基本的算术操作 ,而进行高级操作时 , expr 和 bc 这两个工具也会经常用到。

  1. #!/bin/bash
  2. no1=4;
  3. no2=5;
  4. let result=no1+no2
  5. echo $result
  1. #!/bin/bash
  2. no1=10;
  3. let no1++
  4. echo $no1
  5. let no1--
  6. echo $no1

简写:

  1. #!/bin/bash
  2. no1=10
  3. let no1+=5
  4. echo $no1
  5. let no1-=6
  6. echo $no1

操作符 [ ] 的用法和 let 命令类似:

#!/bin/bash
no1=2
no2=3
result=$[ no1 + no2 ]
echo $result
#也可以使用 $前缀
result=$[ $no1 + 5 ]
echo $result

expr:

#!/bin/bash
no1=3
no2=4
result=`expr $no1 + $no2`
echo $result

result=`expr 5 + 10`
echo $result

result=$(expr $no1 + 5)
echo $result


标准输出和标准错误

cmd 2>stderr.txt 1>stdout.txt

cmd 2>&1 output.txt   和   cmd &> output.txt 效果一样

tee命令,得到标准输出并写入下一个文件


普通数组和关联数组(hash数组)

bash4.0版本之后才支持关联数组

数组定义:

array_var=(1 2 3 4 5 6)

array_var[0]="test1"

打印数组:
echo ${array_var[0]}

echo ${array_var[*]}      #打印所有数组成员

echo ${array_var[@]}     #打印所有数组成员

echo ${#array_var[*]}     #打印数组长度

关联数组:略


find

find . -iname "example*"    #-iname忽略字母大小写

find . \( -name "*.txt" -o name "*.pdf" \) -print        #-o  OR操作

find /home/users -path "*/slynux/*" -print  #-path 用通配符匹配文件路径

find . -regex ".*\(\.py\|\.sh\)$"  #用正则找

find . -iregex ".*\(\.py\|\.sh\)$"  #让正则忽略大小写

find . ! -name "*.txt" -print  #找出所有不以txt结尾的文件名

find . -maxdepth 1 -name "f*" -print  #最大深度为1,也就是当前目录

find . -mindepth 2 -name "f*" -print  #最小深度为2,从下一层目录找

find . -type d -print  #找出所有目录,不包括文件

find . -type f -print  #找出所有文件,不包括目录

find . -type f -atime -7 -print   #7天内被访问过的恩所有文件

find . -type f -atime 7 -print  #打印出恰好在7天前被访问过的所有文件

find . -type f -atime +7 -print  #打印出访问时间超过7天的所有文件。

-atime  -mtime  -ctime  #都是基于天

-amin  -mmin  -cmin  #都是基于分钟

find . -type f -amin +7 -print  #打印出访问时间超过7分钟的所有文件

find . -type f -newer file.txt -print  #找出比file.txt修改时间更近的所有文件

find . -type f -size +2k  #大于2kb的文件,b(512字节,块),c字节,w字(2字节),k(1024字节),M(1024k),G(1024M)

find . -type f -size -2k  #小于2kb的文件

find . -type f -size 2k  #大小等于2kb的文件

find . -type f -name "*.swp" -delete  #删除swp文件

find . -type f -perm 644 -print  #查找权限为644的文件

find . -type f -name "*.php" ! -perm 644 -print  #找出服务器上所有的php文件并且权限不是644的。

find . -type f -user alex -print  #找出所有alex拥有的文件


分割文件

split -b 10k data.file  #把文件切割成10k大小 data.file xaa xab xac xad

split -b 10k data.file -d -a 4  #切割成4位数字补全的大小data.file x0009 x0019 x0029 x0039

split -b 10k data.file -d -a 4 split_file  #data.file  split_file0000  split_file0001  split_file0002

split -l 10 data.file  #10行一割


使用环回文件

dd if=/dev/zero of=big.img bs=1G count=1

mkfs.ext4 big.img

mkdir /mnt/loopback

mount -o loop big.img /mnt/loopback


sed

sed 's/text/replace/' file >newfile

mv newfile file

等价于 sed -i 's/text/replace/g' file

sed -i 's/text/replace/3g' file  #从第三次找到的地方修改,改到最后

echo this is an example | sed 's/\w\+/[&]/g'  #已匹配字符串标记使用&匹配找到的内容并加上[ ], [this] [is] [an] [example]

echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'  #this is 7 in a number      命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,\(..\) 用于匹配子串,对于匹配到的第一个子串就标记为 \1,依此类推匹配到的第二个结果就是 \2,例如:
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'     #BBB aaa


awk

awk 'BEGIN {pring "start"} pattern { commands} END { print "end"}' file

工作流程:

1.执行begin{commands}语句快

2.从文件或stdin中读取一行,执行pattern{ commands }。重复这个过程,知道文件全部读取完。

3.最后执行end{commands}语句块

拼接字符串

echo | awk '{var1="v1";var2="v2";var3="v3"; print var1"-"var2"-"var3;}'  #v1-v2-v3

特殊变量:

NR: 表示记录数量,在执行过程中对应于行号
NF:表示字段数量,在执行过程中对应于当前行的字段数
$0: 这个变量包含执行过程中当前行的文本内容
$1: 第一个字段的文本内容
$2: 第二个字段的文本内容

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  }'

结果:

Line no:1,No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3

Line no:2,No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5

Line no:3,No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

awk运算:

seq 5 | awk 'BEGIN{ sum=0;print "Summation:"}{print $1"+";sum+=¥1}END{print "==";print sum}'

结果:

Summation:

1+

2+

3+

4+

5+

==

15

例子:

awk 'END{print FILENAME}' awk.txt 打印文件名

例子:

cat section.txt
line with pattern1
line with pattern2
line with pattern3
line end with pattern4
line with pattern5

awk */pa.*3/, /end/* section.txt
输出结果是:
line with patern3
line end with pattern4

05-08 07:59