Linux常用命令【原创】

 

 

查看文件内容-while:

cat 1.txt|while read line;do echo $line;done

while read line; do echo $line; done <./1.txt

从日志当中测试连接统计情况

while :; do tail -n 100 /app/nginx/web.log |cut -d -f 8|sort|uniq -c;sleep 5;done

统计文件代码行数:

find . -type f -name "*.sh" | xargs wc -l

 

统计sh文件中含有lst字符串并降序排列

find . -type f -iname "*.sh"| xargs grep -c lst | grep -v ":0$" | sort -t : -k 2 -nr

 

找到当前文件夹下非jpg和JPG文件内容中的ab替换为cd

find . -type f -print |grep -v ".*\.\(jpg\|JPG\)" | xargs sed -i "s/ab/cd/g"

if/else:

exist=1;ip=192.168.0.1;port=3306;if [ ${exist} -eq 1 ]; then echo ${ip}:${port};fi

for:

for ip in 192.168.1.{1..255} ;do ping ${ip} -w 1 &> /dev/null && echo ${ip} is Alive;done

for ip in `cat iplist`;do scp config/${ip}.conf $ip:/home/shell/;done

for x in `cat 1.txt`; do echo $x;mkdir dir{0..2}{0..2}_$x; done

for i in `cat iplistr.ip`; do echo $i; ssh $i "supervisorctl start nginx";done

mysql相关:

socket=`ps -ef|grep mysql|grep -v grep|grep sock|awk 'BEGIN{FS = "--"}{for (f=1; f <= NF; f+=1) {if ($f ~ /sock/) {print $f}}}'|awk -F'=' '{print $2}'|grep 3306`;echo $socket

while :; do sleep 1;netstat -lanp|grep 3306|grep ESTABLISHED|awk '{print $5}'|awk -F ':' '{print $1}'|sort|uniq|wc -l|awk 'BEGIN{a="'$(date +%H:%M:%S)'";}{printf "%s,%d\n",a,$1}' >> access_num.log;done

查看系统资源

取进程占用 cpu 最高的前10个进程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

取进程占用内存(MEM)最高的前10个进程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

查找系统占用磁盘最大的前十个文件

du -sk /*|sort -rn|head

排名前5的文件大小

find . -type f -exec ls -l -h {} \; | sort -nr -k 5 | head -n 5

统计超过1年的zip压缩文件的总和

find ./ -name "*.zip" -mtime +365|xargs du -ch

查看CPU及硬盘大小

# 查看CPU型号

grep 'model name' /proc/cpuinfo  | head -1 | awk -F":" '{print $2}'

# 查看物理CPU个数

grep 'physical id' /proc/cpuinfo | sort -u | wc -l

# 查看逻辑CPU的个数

grep 'processor' /proc/cpuinfo | sort -u | wc -l

# 查看磁盘大小

fdisk -l | grep 'Disk /dev/xvd' | awk '{print $3}' | awk '{sum+=$1} END {print sum}'

 

解释

SUM += $1

sum默认初值为0。awk逐行处理,$1为每行的第一个字段,就是计算每行第一个字段的累加和。

END部分是处理完所有行后执行的。

print SUM  即打印最终的累加和

1.CPU

 

# 查看物理CPU个数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

 

# 查看每个物理CPU中core的个数(即核数)

cat /proc/cpuinfo| grep "cpu cores"| uniq

 

# 查看逻辑CPU的个数

cat /proc/cpuinfo| grep "processor"| wc -l

 

# 查看CPU信息(型号)

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

 

 

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数

# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

2、disk

查看磁盘大小

fdisk -l | grep 'Disk /dev/xvd' | awk '{print $3}' | awk '{sum+=$1} END {print sum}'

3、free -m

centos7查看内存

[root@localhost proc]# free -m
total        used        free      shared  buff/cache   available
Mem:            977         360          97           7         520         411
Swap:          2047           0        2047

空闲内存total-used=free+buff/cache
我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。

 

查看系统信息

 

date;uname -ar;

more /etc/redhat-release;

top -n 1|grep -E 'Tasks|Mem|Swap';

df -kh;

free -m;

netstat -nltp;

cat /proc/net/sockstat;

cat /proc/cpuinfo|grep 'physical id'|sort -n|uniq -c;

cat /proc/cpuinfo|grep -E 'vendor_id|model name|cpu MHz|cache size'|sort -n|uniq -c;

getconf LONG_BIT;

/sbin/ifconfig|grep HWaddr|awk '{print $0,$4,$5}';

/sbin/ifconfig|grep inet|grep -v inet6|grep -v 127.0.0.1;

dmidecode |grep Product

 

date;uname -ar;more /etc/redhat-release;top -n 1|grep -E 'Tasks|Mem|Swap';df -kh;free -m;netstat -nltp;cat /proc/net/sockstat;cat /proc/cpuinfo|grep 'physical id'|sort -n|uniq -c;cat /proc/cpuinfo|grep -E 'vendor_id|model name|cpu MHz|cache size'|sort -n|uniq -c;getconf LONG_BIT;/sbin/ifconfig|grep HWaddr|awk '{print $0,$4,$5}';/sbin/ifconfig|grep inet|grep -v inet6|grep -v 127.0.0.1;dmidecode |grep Product

iostat查看IO

iostat 3 3

 

iostat -d -x -k 1 10

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

sda          1.56  28.31  7.84 31.50   43.65    3.16    21.82     1.58     1.19     0.03    0.80   2.61  10.29

sda          1.98  24.75 419.80  6.93 13465.35  253.47  6732.67   126.73    32.15     2.00    4.70   2.00  85.25

sda          3.06  41.84 444.90 54.08 14204.08 2048.98  7102.04  1024.49    32.57     2.10    4.21   1.85  92.24

可以看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,但是已经很繁忙了。

 

iostat

iostat -d -k 1 10 #查看TPS和吞吐量信息

iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)应该低于5ms,如果大于10ms就比较大了。

iostat -c 1 10 #查看cpu状态

 

Linux iostat监测IO状态 - 翼动动空 的个人空间 - 开源中国社区

http://my.oschina.net/u/2294938/blog/673925

sed使用方法

替换

sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

 

文件5-10行的前面加#号

sed -i "5,10s/^/#/" host_slow.log

 

查找 00:10:34至00:10:38的日志内容

cat server.out.20160114 |sed -n '/2016-01-13 00:10:34/,/2016-01-13 00:10:38/p'

 

查看指定时间的日志

sed -n '/2016-01-13 00:10:34/,/2016-01-13 00:10:38/p'  server.out.20160114

 

sed用法,把空格和tab开头的去除掉

sed 's/^[ t]*//g' 等于 sed 's/^[ \t]*//g

例子:grep 'cpu cores' /proc/cpuinfo |uniq |awk -F : '{print $2}' |sed 's/^[ \t]*//g'

 

打印多个条件

搜索error和fail

sed -n '/error/p; /fail/p' ss170207_7926.log|less

 

打印第几行

要得到文本文件‘linuxmi.txt’的第五行

sed -n '5 p' linuxmi.txt

 

y转换

echo "this is 1 for test 1"|sed 'y/123/456/'

this is 4 for test 4

将1转成成4

 

&用来代表替换命令中的匹配模式

echo "The cat sleeps in his hat. "|sed 's/.at/"&"/g'

The "cat" sleeps in his "hat".

w向文件写入

sed '1,2w writefile' data1

number 1 This is a test of the best script.

number 2 This is a test of the best script.

number 3 This is a test of the best script.

This is a test of the best script.

This is a test of the best script.

This is a test of the best script.

[root@hchtest2 ~]# cat writefile

number 1 This is a test of the best script.

number 2 This is a test of the best script.

 

c修改

cat data1

This is a test of the best script.

This is a test of the best script.

This is a test of the best script.

This is a test of the best script.

 

将第三行修改成this is insert line

[root@hchtest2 ~]# sed '3c\this is insert line\' data1

This is a test of the best script.

This is a test of the best script.

this is insert line

This is a test of the best script.

sed 替换和添加

替换PASS_MAX_DAYS的数字为90

sed -i  '/PASS_MAX_DAYS/s/[0-9]\+/90/g' /etc/login.defs

 

注释pam_cracklib.so所在的这行

sed -i  '/pam_cracklib.so/s/^/#/' /etc/pam.d/system-auth

 

替换ulimit -S -c 0 > /dev/null 2>&1

sed -i '/ulimit[[:space:]]*-S[[:space:]]*-c[[:space:]]/s/^/#/' /etc/profile

在ntp.confwww.pool.ntp.org下面添加server 10.72.8.127 iburst

sed -i '/www.pool.ntp.org/a\server 10.72.8.127 iburst' /etc/ntp.conf

 

在ntp.conf中server 10.72.8.127 iburst上面添加server 10.70.69.39 iburst

sed -i '/server 10.72.8.127/i\server 10.70.69.39 iburst' /etc/ntp.conf

 

 

将以Server=开头的内容替换为Server=10.70.160.243,10.72.14.45,bj.emon.com

sed -i 's/^Server=.*/Server=10.70.160.243,10.72.14.45,bj.emon.com/g' $file

sed -i 's/^ServerActive=.*/ServerActive=10.70.160.243,10.72.14.45,bj.emon.com/g' $file

 

在内容前后添加

在Server=开头的内容后面添加

sed -i 's/^Server=.*/&,10.70.160.243,10.72.14.45,bj.emon.com/g' /usr/local/zabbixagent/conf/zabbix_agentd.conf

 

在空格或tab加ansible开头的行,后面添加内容

sed 's/^[[:space:]][[:space:]]ansible.*/& -l 10.72.37.39,10.72.37.40/g' deploy_39_40.bash

 

在Server=开头的内容前面添加

sed -i 's/^Server=.*/10.70.160.243,10.72.14.45,bj.emon.com&/g' /usr/local/zabbixagent/conf/zabbix_agentd.conf

 

要求:(1) 删除所有空行;(2) 一行中,如果包含"1111",则在"1111"前面插入"AAA",在"11111"后面插入"BBB"

sed '/^$/d;s/1111/AAA&/;s/1111/&BBB/' /tmp/input.txt

 

在每行的头添加字符,比如"HEAD",命令如下:

sed -i 's/^/HEAD&/' /tmp/input.txt

 

在每行的尾部添加字符,比如"tail",命令如下:

sed -i 's/$/&tail/' /tmp/input.txt 

 

文件内容的最后一行添加

sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile

[root@localhost ~]# tail -3 /etc/profile

export JAVA_HOME=/usr/local/jdk

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

 

关于上面那个sed命令的说明:
sed -i.ori :-i表示对文件本身操作,.ori表示修改的同时备份源文件
$a :$表示文件内容的最后一行,a表示在下面进行数据插入
\n :表示插入数据时换行

 

文件内容的第几行后面添加

# 在文件第10行后面添加内容
sed -i '10a\PATH=$HOME/.bin' /home/readonly/.bash_profile

 

sed的替换、新增、删除操作例子

替换 每行首个匹配内容:
sed -i 's#原内容#替换后内容#' 文件名
示例:替换首每行的第1个sed为SED
admin-1@ubuntu:~$ sed -i 's#sed#SED#' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed sed
nihao SED sed sed
nihao SED sed sed


替换 全部匹配内容:
sed -i 's#原内容#替换后内容#g' 文件名
示例:替换全部sed为des
admin-1@ubuntu:~$ sed -i 's#sed#SED#g' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED SED SED
nihao SED SED SED
nihao SED SED SED


指定 行号替换 首个匹配内容:
sed -i ' 行号s#原内容#替换后内容#' 文件名
示例:替换第2行的首个SED为sed
admin-1@ubuntu:~$ sed -i '2s#SED#sed#' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED SED SED
nihao sed SED SED
nihao SED SED SED


首行指定 列号替换匹配内容:
sed -i 's#原内容#替换后内容# 列号' 文件名
示例:替换每行的第2个SED为sed
admin-1@ubuntu:~$ sed -i 's#SED#sed#2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed SED


指定 行号列号匹配内容:
sed -i ' 行号s#原内容#替换后内容# 列号' 文件名
示例:替换第3行的第2个SED为sed
admin-1@ubuntu:~$ sed -i '3s#SED#sed#2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed sed

增加操作
作用:
在指定行号的下一行增加内容
格式:
sed -i '行号a\增加的内容' 文件名


注意:
如果增加多行,可以在行号位置写个范围值,彼此间使用 逗号隔开,例如
sed -i '1,3a\增加内容' 文件名
演示效果:


指定行号增加内容
admin-1@ubuntu:~$ sed -i '2a\zengjia-2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
zengjia-2
nihao SED sed sed


指定1~3每行都增加内容
admin-1@ubuntu:~$ sed -i '1,3a\tongshi-2' sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

在指定行号的当行增加内容
格式:
sed -i '行号i\增加的内容' 文件名
注意:
如果增加多行,可以在行号位置写个范围值,彼此间使用 逗号隔开,例如
sed -i '1,3a\增加内容' 文件名

指定行号增加内容
admin-1@ubuntu:~$ sed -i '1i\insert-1' sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

删除操作
作用:
指定行号删除
格式:
sed -i '行号d' 文件名
注意:如果删除多行,可以在行号位置多写几个行号,彼此间使用 逗号隔开,例如
sed -i '1,3d' 文件名


删除第4行内容
admin-1@ubuntu:~$ sed -i '4d' sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed


删除多行(3-5行)内容
admin-1@ubuntu:~$ sed -i '3,5d' sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao SED sed sed

 

sed精确匹配替换

\<  \b 表示单词边界
\B 表示非单词边界,应理解为(非单词)边界,而不是非(单词边界),它仍然匹配的是边界

# 匹配右边的特殊字符
sed  's#\<4--name--\B#123#g' a.txt

# 匹配左边的特殊字符
sed  's#--name\>#123#g'    a.txt

# 精确匹配无特殊字符 \b sed  's#\bname1\b#123#g' a.txt  ==  sed  's#\<name1\>#123#g' a.txt
例子
# 精确匹配nfs:all并注释掉
sed -i 's/\<nfs:all\>/#nfs:all/g' /etc/hosts.deny

# 精确匹配umask 027并注释掉
sed -i 's/\<umask 027\>/#umask 027/g' /etc/profile

 

cut截取文件第几列

截取txt_linuxmi文件的前10列

cut -c1-10 txt_linuxmi

要截取该文件中的第二,第五和第七列。

cut -d;-f2 -f5 -f7 txt_linuxmi 

find使用方法

删除或移动文件

find . -type f -name *.log | xargs rm

find . -type f -name "*.sh" | xargs -i mv {} /home/shell

 

xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如

 # find . -type f -name "*.log" | xargs rm -rf *                        

就将以log结尾的文件删除了,如果我想去移动或者复制就需要使用参数来代替了。

 

复制文件

find . -type f -name "*.txt" | xargs -i cp {}  /tmp/k/

 

删除文件

find . -mtime +1 -type f -exec rm -rf {} \;

 

移动文件

find . -mtime +120|xargs -i mv {} /tmp/log_bak/

 

请不要用此方法移动文件夹,会直接删除文件夹

ls -ld phpframe-* -exec mv {} /backup \;

ls -ld phpframe-*|xargs mv /backup/

 

 

用xargs查询,注意要有|,另此命令是分批处理之前查询的结果

find . -perm 777|xargs ls -l

 

如果系统磁盘突然没空间了,查找最近五天内更过的文件

find / -mtime -5

 

查看更改时间在5天前的文件

find / -mtime +5

 

根据文件内容来查找相关文件所在位置

find ./ -type f| xargs grep -i 'dataSource'

 

根据文件修改时间、名字复制到制定目录

find ./ -mtime +120 -name "mysql-bin*"|xargs -n1 -i cp -a {} /home/mysqlbinlog-bak/mysql3306-binlog/

 

根据文件名后缀,删除文件。例如删除phd的文件

-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0004.phd

-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0006.phd

-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0007.phd

-rw-r--r--. 1 root root 662M Jun 14 10:30 heapdump.20160614.102831.29419.0008.phd

 

find ./ -iregex ".*\.phd"|xargs rm -rf

 

删除指定日期内文件

例如,如果我们想要查找在2023年1月1日到2023年2月1日之间创建或修改过的文件,我们可以运行以下命令:
find /path/to/directory -type f -newermt "2023-01-01" ! -newermt "2023-02-01"

 

grep使用方法

查询并输出成功或失败

grep 'SELINUX=enforcing' /etc/selinux/config 2>&1 >/dev/null  &&  print_PASS || print_FAIL

 

截取TYPE列的信息

blkid /dev/sda1 | awk -F"=" '{print $2}'|awk '{print $2}'

 

blkid /dev/sda1 | awk -F"=" '{print $2}'|awk '{print $1}'|cut -d"\"" -f2

bb0954a8-3507-4613-b4ee-5c5961c43a36

 

判断磁盘大小

lsblk | grep sda1 | grep -qs '2.1G' && print_PASS || print_FAIL

 

变量赋值为一个命令运行的结果

mode=`ls -lh /root/foo.sh  | awk '{print $1}'`

查询防火墙服务是否加入防火墙

firewall-cmd --list-all | grep   services | grep  -qsE ssh && print_PASS || print_FAIL

 

firewall-cmd --list-all | grep -qsE "rule family=\"ipv4\" source address=\"172.17.10.0/24\" service name=\"ssh\" reject" && print_PASS || print_FAIL

 

判断服务是否起来

systemctl status httpd &>/dev/null && echo PASS || echo FAIL

 

查进程并杀掉

ps -ef|grep "/opt/openoffice4/program/soffice"|grep -v grep|grep -v grep|awk '{print $2}'  | xargs kill

 

grep搜索文件中的关键字

明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip

示例:
grep -ir "mysql" 目录

忽略子目录
grep -d skip "mysql" 目录

grep -v "^$"过滤空行没有效果

如果您在使用grep -v "^$"去除文件中的空行时没有效果

使用正则表达式更精确匹配空行:grep -v '^\s*$'。这将匹配所有只包含空格字符的行。

grep -v '^\s*$' large_file.txt > new_file.txt

 

awk使用方法

查找document的selinux标签

         documentroot=`grep "DocumentRoot" /etc/httpd/conf.d/vhost-server0.conf | awk '{print $2}' | awk -F\" '{print $2}'`

         context=`ls -lZd $documentroot | awk -F: '{print $3}'

 

查看文件权限

ls -lh /root/foo.sh  | awk '{print $1}'

 

显示以字母t开头的所有用户信息

awk '/^t/{print $1}' /etc/passwd

 

显示UID大于500的用户信息

awk -F: '$3>=500{print $1,$3}' /etc/passwd

 

BEGIN/END

BEGIN/END,BEGIN在第一行被读取前执行,END表示在最后一行匹配完再执行

示例1:统计每种shell使用的用户的个数

# awk -F: '{shell[$NF]++}END{for(A in shell){print A,shell[A]}}' /etc/passwd

/bin/sync 1

/bin/bash 10

/sbin/nologin 34

 

 

示例2:统计每个TCP连接状态的个数

# netstat -ant | awk '/^tcp/{STATE[$NF]++}END{for (s in STATE) print s,STATE[s]}'

LISTEN 15

ESTABLISHED 1

 

示例3:统计日志文件中每个IP地址的访问量

awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' /var/log/httpd/access_log

 

cd /usr/local/nginx/logs

 

awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' access.log |sort -rn|head -n 30

 

cat access.log|sort|awk '$NF!~/-/ {print $1"," $NF}'|uniq |awk -F  , '{print $1}'|uniq -c|sort -nr|head -20

 

统计所有日志大小

find . -mtime +120|xargs du -s|awk '{sum+=$1} END {print sum/1024/1024}'

 

nginx访问统计

# nginx IP 访问次数
awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' access.log|sort -nr

awk '{a[$1]++}END{for (j in a) print a[j],j}' access.log|sort -nr

# IP总访问量
awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' http_access.log|sort -nr|awk '{sum+=$1} END {print "Sum = ", sum}'

# 排除4XX和5XX代码的日志
cat access.log|grep -v -w "4[0-9][0-9]"|awk '{a[$1]++}END{for (j in a) print a[j],j}'|sort -nr

awk '{if($9!~/4[0-9][0-9]|5[0-9][0-9]/) print $0}' access.log|awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' |sort -rn
1.根据访问IP统计UV

awk '{print $1}'  access.log|sort | uniq -c |wc -l

2.统计访问URL统计PV

awk '{print $7}' access.log|wc -l

3.查询访问最频繁的URL

awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more

4.查询访问最频繁的IP

awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more

5.根据时间段统计查看日志

cat  access_log| sed -n '/8\/Mar\/2017:21/,/10\/Mar\/2017:22/p'|more|wc -l

6.统计访问量前10的ip

awk '{a[$1]++}END{for (j in a) print a[j],j}' /var/log/nginx/access.log|sort -nr|head -10

参考

用shell统计访问日志里每个ip访问次数【转】 - paul_hch - 博客园 https://www.cnblogs.com/paul8339/p/6207182.html

awk可以截取多个字段

dir -l|awk '{print $3,$4,$9}'

 

awk的NR用法

打印第二行第二项

[root@hchtest2 ~]#  free -m | awk 'NR==2 {print $2}'

1878

You have new mail in /var/spool/mail/root

[root@hchtest2 ~]#  free -m

             total       used       free     shared    buffers     cached

Mem:          1878       1804         73          0         73        293

-/+ buffers/cache:       1437        441

Swap:         1635         49       1586

 

打印第一行

cat /etc/issue.net | awk 'NR==1 {print}'

CentOS release 6.5 (Final)

[root@hchtest2 ~]# cat /etc/issue.net

CentOS release 6.5 (Final)

Kernel \r on an \m

 

不打印第一行

# helm uninstall $(helm list|awk 'NR!=1{print $1}')

 

awk统计命令

1、求和

cat data|awk '{sum+=$1} END {print "Sum = ", sum}'

2、求平均

cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'

3、求最大值

cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'

4、求最小值(min的初始值设置一个超大数即可)

awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'

 

查看内存信息

dmidecode|grep -P -A5 "Memory\s+Device"|grep Size

egrep使用方法

用egrep查找3项内容memory_limit、post_max_size、upload_max_filesize

cat php.ini|egrep "memory_limit|post_max_size|upload_max_filesize"

memory_limit = 512M

post_max_size = 100M

upload_max_filesize = 100M

查找java进程

ps -ef|grep java|egrep -o "[1-9]{4}"|head -n1

date

设置变量为3天前

[root@hchtest3 ~]# date +%F

2015-11-30

[root@hchtest3 ~]# date +%F -d "-3 days"

2015-11-27

[root@hchtest3 ~]# date +%Y-%m-%d -d "-3 days"

2015-11-27

 

时间输入

date '+%F %r'

2016-12-12 09:32:07 AM

 

setfacl

设置目录/javasoft下的所有文件及文件夹都对ljun有读写权限

setfacl -R -m u:ljun:rwx /javasoft/

 

不加 -R递归,就只在 /javasoft里有权限, /javasoft/123里就没有权限了

setfacl -m u:ljun:rwx /javasoft/

 

现有一目录是虚拟机和linux共享的,但是每次程序调用新建的文件都发现没有权限。

于是指定特定目录及其子目录下新建的文件或目录对于用户qhfz都有读写执行的权限

-R表示递归 -m表示设置文件acl规则

setfacl -R -m d:u:qhfz:rwx /data2/ResourceCase

setfacl -R -m d:u: ResourceCase:rwx /data2/ResourceCase

--删除ACL规则使用-b

setfacl -R -b /data2/ResourceCase

nmap

nmap查找网络中所有活跃的主机

$ nmap -sn 10.42.0.0/24

  • -sn- 是扫描的类型,这里是 ping 方式扫描。默认上,Nmap 使用端口扫描,但是这种扫描会禁用端口扫描。
  • 10.42.0.0/24- 是目标网络,用你实际的网络来替换

 

mount

挂载cifs

mount -t cifs -o username=andy,password=redhat //172.24.6.10/common /haha

 

cat

eof结束

利用cat输入脚本,eof结束输入

if [ ! -f LNMP+zabbix.repo ]; then

cat> /etc/yum.repos.d/LNMP+zabbix.repo <<'EOF'

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/6/$basearch/

gpgcheck=0

enabled=1

EOF

fi

 

 

设置变量为一个查询结果命令,并取出结果的某一列

#!/bin/bash

RESULT=$(cd /opt/mqm/bin

su mqm << remotessh

./runmqsc HUFFPMQ

dis qlocal(USKY.HUFFP.RESPONSE4) CURDEPTH;

end

exit

remotessh

)

VARA=$(echo $RESULT |grep -o "CURDEPTH([0-9]\+)"|grep -o "[0-9]\+")

#VARA=$(echo $RESULT | awk "/CURDEPTH\(([0-9]*)/" |grep -o "[0-9]\+")

echo $VARA

 

 

# cat << EOF > /tmp/3.txt

> aaaa

> bbbb

> cccc

> dddd

> EOF

 

 

创建500M的主分区

# echo -e "n\np\n1\n\n+500M\nw\n" | fdisk /dev/sdb &> /dev/null 

 

\n:自动换行

 

-n, --number 对输出的所有行编号

-b --number-nonblank 对非空输出行编号

-T, --show-tabs 将跳 字符显示为 ^I

[root@localhost ~]# cat -b /etc/fstab   注:查看/etc/目录下的profile内容,并且对非空白行进行编号,行号从1开始;
[root@localhost ~]# cat -n /etc/profile    注:对/etc目录中的profile的所有的行(包括空白行)进行编号输出显示;

 

 ps

查看僵尸进程

ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"

 

批量删除僵尸进程

ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"|awk '{print $2}'|xargs kill -9

 

ps aux | less 

         vsz:进程所占用内存的总大小 以kb为单位

         rss:进程所占用实际物理内存的大小 以kb为单位

删除停止stop进程

# ps -A -ostat,ppid,pid,cmd | grep -e '^[T]'
T 39000 40581 python
T 39000 40642 python read_log.py
[root@bj01 home]# kill -9 40581
[root@ibj01 home]# kill -9 40642

 

lsof

查看端口是哪个进程占用

[root@hchtest3 nginx]# lsof -i:80

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

haproxy 2200 nobody    4u  IPv4  11716      0t0  TCP hchtest3:http (LISTEN)

top

load average: 0.01, 0.03, 0.05  

         cpu在1分钟、5分钟、15分钟的平均负载值

         平均负载值/cpu个数                          

                   大于1:cpu资源饱和

                   小于1:cpu使用正常

         查看cpu个数:

         # grep "model name" /proc/cpuinfo

         model name     : Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz

 

         # grep "model name" /proc/cpuinfo  | wc -l

         1

 

top命令进程排序显示

         M:按内存占用百分比

         P:按CPU占用百分比

         T:按进程运行时间

 

set显示环境变量

sar

查看CPU情况

sar 5 5

sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。

 

输出项说明:

 

CPU:all 表示统计信息为所有 CPU 的平均值。

 

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

 

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

 

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

 

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

 

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

 

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

 

1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈

 

2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量

 

3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

 

要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来

 

怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看

 

怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看

 

怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

 

linux sar 命令详解 - Cai's - 开源中国社区

http://my.oschina.net/caiyuan/blog/119012

 

 

CPU使用情况

sar -u -o 60 5

 

在所有的显示中,我们应主要注意%wio和%idle,%wio的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存, 此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

 

磁盘使用情况

sar -d 5 3

 

怀疑CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b、sar -u和sar-d来看

 

sar详解(linux/unix通用) | 旺旺知识库

http://www.toxingwang.com/linux-unix/2027.html

 

SAR 命令详解-dbconf-ChinaUnix博客

http://blog.chinaunix.net/uid-23177306-id-2531032.html

 

sar命令--Linux 性能分析 - richard_2010 - ITeye技术网站

http://richard-2010.iteye.com/blog/1271044

uniq

uniq -c删除重复值

netstat -an|grep 8080 |grep FIN_WAIT2| grep -E '::ffff:'| awk -F: '{print $8}'|sort -n|uniq -c

 

寻找会员号,并把重复次数倒序排列出来

cat server.out.20160216 |grep "HUBTM LOGIN"|grep member_id|awk -F',' '{print $2}'|awk -F'=' '{print $2}'|sort | uniq -c | sort -k1,1nr | head -10

sort

指令各部分的功能:

sort:  对单词进行排序

uniq -c:  显示唯一的行,并在每行行首加上本行在文件中出现的次数

sort -k1,1nr:  按照第一个字段,数值排序,且为逆序

head -10:  取前10行数据

 

iptables防火墙策略

 

service iptables save

//将规则保存在/etc/sysconfig/iptables文件里

 

查看防火墙策略

iptables -L -n --line-number

iptables -vnL

service iptables status

 

查看防火墙nat策略

iptables -L -t nat

 

删除INPUT的第24条策略

iptables -D INPUT 24

 

-I插入策略放到最上面(加入防火墙策略使用这个)

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8097 -j ACCEPT

 

-A增加一条规则到最后

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8097 -j ACCEPT

-D删除策略

iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 8017 -j ACCEPT

 

ifconfig

临时绑定IP

ifconfig eth0:0 10.72.32.185 netmask 255.255.255.0

 

eth0绑定网卡

/sbin/ip addr add "10.70.72.126/24" dev eth0

 

删除临时IP

/sbin/ip addr del "10.70.72.126/24" dev eth0

 

添加方法:
ifconfig eth0:0 192.168.2.99 netmask 255.255.255.0
ip addr add 192.168.2.199/24 dev eth0:0

删除方法:
ip addr delete 192.168.2.199 dev eth0:0

 

netstat

Linux 常用netstat命令 实例讲解

 

这是一个十分常用的命令,可以让你实时了解到云主机当前的状态,例如:常见的80连接数量,以及按一些排序,来检查是否被攻击?查看time_wait和syn连接数量等等。

 

1.查看所有80端口的连接数

 

netstat -nat|grep -i "80"|wc -l

 

2.对连接的IP按连接数量进行排序

 

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

 

3.查看TCP连接状态

 

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

 

netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'

 

netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'

 

netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'

 

netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn

 

netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c

 

4.查看80端口连接数最多的20个IP

 

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

 

netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}' |sort -rn|head -n20

 

5.用tcpdump嗅探80端口的访问看看谁最高

 

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

 

6.查找较多time_wait连接

 

netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

 

7.找查较多的SYN连接

 

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

tar

不解压查看压缩文件内容

tar tvf apache-tomcat-8.0.36.tar.gz

gzip、gunzip

Linux压缩保留源文件的方法:

gzip –c filename > filename.gz

Linux解压缩保留源文件的方法:

gunzip –c filename.gz > filename

 

设置环境变量

echo "export JAVA_HOME=/usr/local/jdk1.7.0_15" >>~/.bashrc

. ~/.bashrc

echo $JAVA_HOME

 

-a 和 &&的区别

注意-a 和 &&的区别,-a用[]里,&&都可以

[root@hchtest3 ~]# if [[ -f /root/while.sh || -f /root/pid.sh ]];then echo exist;fi

exist

[root@hchtest3 ~]# if [[ -f /root/while.sh -a -f /root/pid.sh ]];then echo exist;fi

-bash: syntax error in conditional expression

-bash: syntax error near `-a'

[root@hchtest3 ~]# if [ -f /root/while.sh -a -f /root/pid.sh ];then echo exist;fi

exist

 

ls

ls -F -R /etc/

层级显示目录下文件、及文件夹

 

ansible常用命令

ansible -i hosts all -m ping -f 20 --output=result

-m 指明要使用的模块名,这里使用ping模块来测试ansible是否可达列表中额主机
-f 指明线程数,默认5个并发。
--output 指明输出文件,不指定的话输出到控制台。
 
在远程主机执行脚本
ansible -i hosts all -m script -a 'mha_stop.sh'
 
#在远程主机执行shell命令(与command模块的区别是支持管道和重定向)
ansible -i hosts all -m shell -a " cat /tmp/authorized_keys >> /root/.ssh/authorized_keys"
 
#往远程主机拷贝文件
ansible -i hosts all -m copy -a "src=/etc/hosts dest=/tmp/hosts mode=600 owner=mdehaan group=mdehaan"
 
#从远程主机拉取文件
ansible -i hosts all -m fetch -a  "src=/etc/hosts dest=/tmp/hosts mode=600 owner=mdehaan group=mdehaan"
 
#更改远程文件属性
ansible -i hosts all -m file -a "dest=/srv/foo/a.txt mode=600"
ansible -i hosts all -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"
ansible -i hosts all -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"
ansible -i hosts all -m file -a "dest=/path/to/c state=absent"
 
#在远程助主机安装/删除/更新包
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=present"
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=absent"
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=latest"
 
#在远程主机启/停服务
ansible -i hosts all -f 50 -m service -a "name=filebeat state=started"
ansible -i hosts all -f 50 -m service -a "name=filebeat state=restarted"
ansible -i hosts all -f 50 -m service -a "name=filebeat state=stopped"
 
#在远程主机部署/删除cron任务
ansible -i hosts all -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible -i hosts all -m cron -a 'backup="True" name="test" minute="0" hour="2" job="ls -alh > /dev/null"'
ansible -i hosts all -m cron -a 'name="test" state=absent'
 

linux open file修改

vi /etc/security/limits.conf
* soft  nofile  65536
* hard nofile 65536

重新登陆即可,但可能对现在已启动服务不生效

ulimit -a查看一下

Linux内核参数调整

由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,让Nginx可以拥有更高的性能;

在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态web内容服务器、反向代理或者提供压缩服务器的服务器时,期内核参数的调整都是不同的,这里针对最通用的、使Nginx支持更多并发请求的TCP网络参数做简单的配置

修改 /etc/sysctl.conf 来更改内核参数

fs.file-max = 999999
#表示单个进程最大可以打开的句柄数;
net.ipv4.tcp_tw_reuse = 1
#参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在;
ner.ipv4.tcp_keepalive_time = 600
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可以更快的清理无效链接。
net.ipv4.tcp_fin_timeout = 30 
#当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的最大时间
net.ipv4.tcp_max_tw_buckets = 5000
#这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
#该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
net.ipv4.ip_local_port_range = 1024 65000 
#定义UDP和TCP链接的本地端口的取值范围。
net.ipv4.tcp_rmem = 10240 87380 12582912 
#定义了TCP接受缓存的最小值、默认值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912 
#定义TCP发送缓存的最小值、默认值、最大值。
net.core.netdev_max_backlog = 8096 
#当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的最大值。
net.core.rmem_default = 6291456 
#表示内核套接字接受缓存区默认大小。
net.core.wmem_default = 6291456 
#表示内核套接字发送缓存区默认大小。
net.core.rmem_max = 12582912 
#表示内核套接字接受缓存区最大大小。
net.core.wmem_max = 12582912 
#表示内核套接字发送缓存区最大大小。
注意:以上的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑;
net.ipv4.tcp_syncookies = 1
#与性能无关。用于解决TCP的SYN攻击。
net.ipv4.tcp_max_syn_backlog = 8192
#这个参数表示TCP三次握手建立阶段接受SYN请求列队的最大长度,默认1024,将其设置的大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的链接请求。
net.ipv4.tcp_tw_recycle = 1 
#这个参数用于设置启用timewait快速回收。
net.core.somaxconn=262114 
# 选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。
net.ipv4.tcp_max_orphans=262114 
#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值。

 

生效配置

---下方不带注释的可以直接复制

fs.file-max = 999999

net.ipv4.tcp_tw_reuse = 1

ner.ipv4.tcp_keepalive_time = 600

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_rmem = 10240 87380 12582912

net.ipv4.tcp_wmem = 10240 87380 12582912

net.core.netdev_max_backlog = 8096

net.core.rmem_default = 6291456

net.core.wmem_default = 6291456

net.core.rmem_max = 12582912

net.core.wmem_max = 12582912

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_tw_recycle = 1

net.core.somaxconn=262114

net.ipv4.tcp_max_orphans=262114

修改好配置文件,执行 sysctl -p 命令,使配置立即生效

 

注意事项

1)开头加解释器:#!/bin/bash

2)语法缩进,使用四个空格;多加注释说明。

3)命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。

4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。

5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。

6)写脚本一定先测试再到生产上。

1 获取随机字符串或数字

获取随机8位字符串:

9个实战及面试常用Shell脚本编写

获取随机8位数字:

9个实战及面试常用Shell脚本编写

cksum:打印CRC效验和统计字节

2 定义一个颜色输出字符串函数

9个实战及面试常用Shell脚本编写

function关键字定义一个函数,可加或不加。

3 批量创建用户

9个实战及面试常用Shell脚本编写

4 检查软件包是否安装

9个实战及面试常用Shell脚本编写

5 检查服务状态

9个实战及面试常用Shell脚本编写

6 检查主机存活状态

方法1: 将错误IP放到数组里面判断是否ping失败三次

9个实战及面试常用Shell脚本编写

方法2: 将错误次数放到FAIL_COUNT变量里面判断是否ping失败三次

9个实战及面试常用Shell脚本编写

方法3: 利用for循环将ping通就跳出循环继续,如果不跳出就会走到打印ping失败

9个实战及面试常用Shell脚本编写

7 监控CPU、内存和硬盘利用率

1)CPU

借助vmstat工具来分析CPU统计信息。

9个实战及面试常用Shell脚本编写

2)内存

9个实战及面试常用Shell脚本编写

3)硬盘

9个实战及面试常用Shell脚本编写

8 批量主机磁盘利用率监控

前提监控端和被监控端SSH免交互登录或者密钥登录。

写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP User Port

9个实战及面试常用Shell脚本编写

9 检查网站可用性

1)检查URL可用性

9个实战及面试常用Shell脚本编写

2)判断三次URL可用性

思路与上面检查主机存活状态一样。

9个实战及面试常用Shell脚本编写

本章写的Shell脚本例子都比较实用,在面试题中也经常出现,希望大家参考着多动手写写,不要复制粘贴就拿来跑,这样是学不会的!

时间格式转换

[root@hchtest-ansible ~]# date -d "1 days ago" +%Y.%m.%d
2019.03.18

[root@hchtest-ansible ~]# date -d "1 days ago" +%Y-%m-%d
2019-03-18

统计某些文件大小总和

ls -l *.2019-03-16*.tar.gz|awk '{sum += $5};END{print sum/1024/1024/1024}'

 

 Linux只读账号配置

整个配置的命令如下(主要使用了:Linux bash受限的shell(RESTRICTED SHELL)

 

步骤
#1.创建只读shell(这步可以省略)

 

ln -s /bin/bash  /bin/rbash

 


#2.创建用户并指定用户启动执行的shell

 

useradd -s /bin/bash readonly

这步不要指定rbash,否侧cd等內建命令无法使用

 


#3.修改用户密码

 

passwd readonly

 


#4.创建用户shell执行命令目录

 

mkdir /home/readonly/.bin

 


#5.root修改用户的shell配置文件

 

chown root. /home/readonly/.bash_profile 
chmod 755 /home/readonly/.bash_profile

并设置文件不可删除权限
chattr -i /home/readonly/.bash_profil

 


#6.修改bash配置文件,主要是指定PATH的读取

 

复制代码
vi /home/readonly/.bash_profile 
# .bash_profile
 
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
 
# User specific environment and startup programs
#PATH=$PATH:$HOME/bin
PATH=$HOME/.bin
export PATH

#切换到只读账号使环境变量生效
su - readonly
source /home/readonly/.bash_profile
复制代码

 


#7.将允许执行的命令链接到$HOME/.bin目录

 

复制代码
ln -s /usr/bin/wc  /home/readonly/.bin/wc
ln -s /usr/bin/tail  /home/readonly/.bin/tail
ln -s /bin/more  /home/readonly/.bin/more
ln -s /bin/cat  /home/readonly/.bin/cat
ln -s /bin/grep  /home/readonly/.bin/grep
ln -s /bin/find  /home/readonly/.bin/find
ln -s /bin/pwd  /home/readonly/.bin/pwd
ln -s /bin/ls  /home/readonly/.bin/ls
ln -s /bin/less /home/readonly/.bin/less
ln -s /bin/tar  /home/readonly/.bin/tar
复制代码

 

 Linux 显示隐藏目录或隐藏文件的占用空间

du -sh .[!.]* * | sort -hr

 

 断文件是否更新

md5sum /usr/local/nginx/conf/blockip.conf > /root/blockip_md5_after
before=$(awk '{print $1}' /root/blockip_md5_before)
after=$(awk '{print $1}' /root/blockip_md5_after)
if [[ $before == $after ]];then
    echo 'blockip.conf is not changed'
else
    echo 'blockip.conf has been changed'
    /etc/init.d/nginx reload
fi

 

 软链接

创建软链接

ln  -s  [源文件或目录]  [目标文件或目录]

例如:

当前路径创建test 引向/var/www/test 文件夹 

ln –s  /var/www/test  test

创建/var/test 引向/var/www/test 文件夹 

ln –s  /var/www/test   /var/test 

 

删除软链接

和删除普通的文件是一眼的,删除都是使用rm来进行操作

 rm –rf 软链接名称(请注意不要在后面加”/”,rm –rf 后面加不加”/” 的区别,可自行去百度下啊)

例如:

删除test

rm –rf test

 

修改软链接

ln –snf  [新的源文件或目录]  [目标文件或目录]

这将会修改原有的链接地址为新的地址

例如:

创建一个软链接

ln –s  /var/www/test   /var/test

修改指向的新路径

ln –snf  /var/www/test1   /var/test

  Linux用户锁定、解锁及锁定查看

[root@l01 ~]# passwd -S pispread
pispread PS 2020-04-30 7 99999 15 -1 (Password set, SHA512 crypt.)

用户锁定 [root@l01
~]# passwd -l pispread Locking password for user pispread. passwd: Success

查看用户 [root@l01
~]# passwd -S pispread pispread LK 2020-04-30 7 99999 15 -1 (Password locked.)

用户解锁 [root@l01
~]# passwd -u pispread Unlocking password for user pispread. passwd: Success

查看用户 [root@l01
~]# passwd -S pispread pispread PS 2020-04-30 7 99999 15 -1 (Password set, SHA512 crypt.)

 Linux ctrl快捷键

ctrl+a: 光标跳到行首。
ctrl+b: 光标左移一个字母。
ctrl+c: 杀死当前进程。
ctrl+d: 删除光标后一个字符或exit、logout。
ctrl+e: 光标移到行尾。
ctrl+f:向后移一个字符。
ctrl+h: 删除光标前一个字符,同backspace键相同。
ctrl+k: 剪切光标后至行尾的内容。
ctrl+l: 清屏,相当于clear。
Ctrl+p:重复上一次命令。
ctrl+r: 搜索之前的命令历史。多次ctrl+r 会一直向上搜索。
ctrl+u: 剪切光标前至行首间的所有内容。
ctrl+w: 剪切前面的字符至上一个空格处。
ctrl+t: 交换光标位置前的两个字符。
ctrl+y: 粘贴或者恢复上次的删除。
ctrl+z: 把当前进程转到后台运行,使用fg命令恢复。
Ctrl+x: 跳回之前移动的原位置。
ctrl+m: 等同于回车键
ctrl+o: 等同于回车键
ctrl+s: 暂时冻结当前shell的输入
ctrl+q: 解冻

补充:
Esc+B: 移动到当前单词的开头
Esc+F: 移动到当前单词的结尾

 网页统计访问量

1.根据访问IP统计UV

awk '{print $1}'  access.log|sort | uniq -c |wc -l

2.统计访问URL统计PV

awk '{print $7}' access.log|wc -l

3.查询访问最频繁的URL

awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more

4.查询访问最频繁的IP

awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more

5.根据时间段统计查看日志

cat  access_log| sed -n '/8\/Mar\/2017:21/,/10\/Mar\/2017:22/p'|more|wc -l

6.统计访问量前10的ip

awk '{a[$1]++}END{for (j in a) print a[j],j}' /var/log/nginx/access.log|sort -nr|head -10

备份复制特定以开头的目录下的文件

ls /usr/local/apache-tomcat-*/conf/catalina.properties|xargs -i cp -a {} {}.bak && ll -thr /usr/local/apache-tomcat-*/conf/catalina.properties*

 ${1:-${service_list}}使用

[root@appbjdck8sm02 k8s]# cat docker_build.sh 
#!/bin/bash

docker_registry=192.168.31.70
kubectl create secret docker-registry registry-pull-secret --docker-server=$docker_registry --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@ctnrs.com -n ms

service_list="eureka-service gateway-service order-service product-service stock-service portal-service"
service_list=${1:-${service_list}}
work_dir=$(dirname $PWD)
current_dir=$PWD

cd $work_dir
mvn clean package -Dmaven.test.skip=true

for service in $service_list; do
   cd $work_dir/$service
   if ls |grep biz &>/dev/null; then
      cd ${service}-biz
   fi
   service=${service%-*}
   image_name=$docker_registry/microservice/${service}:$(date +%F-%H-%M-%S)
   docker build -t ${image_name} .
   docker push ${image_name} 
   sed -i -r "s#(image: )(.*)#\1$image_name#" ${current_dir}/${service}.yaml
   kubectl apply -f ${current_dir}/${service}.yaml
done

说明:
service_list="eureka-service gateway-service order-service product-service stock-service portal-service"
service_list=${1:-${service_list}}是如果没有输入第一个参数,service_list就为上面的变量设置

根据CPU、内存排序

按内存从大到小排列,查看前10
ps -e -o "%C : %p : %z : %a"|head -n1 && ps -e -o "%C : %p : %z : %a"|sort -k5 -nr|head -n 10

按 CPU 利用率从大到小排列,查看前20
ps -e -o "%C : %p : %z : %a"|head -n1 && ps -e -o "%C : %p : %z : %a"|sort -nr|head -n 20|grep -v "VSZ"

执行脚本时输入内容

curl -o /tmp/linux-inst.sh http://10.127.109.150/tools/linux-inst.sh >/dev/null 2>&1 && echo '10.127.109.150' | bash /tmp/linux-inst.sh >/dev/null 2>&1;echo $?

# 执行脚本时输入内容
echo '10.127.109.150' | bash /tmp/linux-inst.sh

另一种方法用 cat << eof

 非root用户切换用户执行命令

# crontab、开机启动设置切换用户执行命令
su - oracle -c "sh /home/oracle-stop.sh"

su - oracle -lc "sh /home/oracle-stop.sh"

# 参数说明
  -, -l, --login               make the shell a login shell, 
                               clears all envvars except for TERM,
                               initializes HOME, SHELL, USER, LOGNAME and PATH
  -c, --command=COMMAND        pass a single COMMAND to the shell with -c

-l 表示同时切换用户目录。比如你要换到oracle用户下你的目录就同时在oracle目录下了。 -c 则表示执行完命令好再返回到原来的用户。

 

Linux修改服务器用户最大进程数、最大打开文件数

修改linux 打开最大文件数
echo "" >> /etc/security/limits.conf
echo "*    soft nproc 65535" >> /etc/security/limits.conf
echo "*    hard nproc 65535" >> /etc/security/limits.conf
echo "*    soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "" >> /etc/profile
echo "ulimit -n 65535" >> /etc/profile
echo "ulimit -u 65535" >> /etc/profile

最大进程数
vi /etc/security/limits.d/90-nproc.conf
* soft nproc 65535

如果修改成ulimited

echo "修改open files参数和最大线程数"
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft nproc unlimited" >> /etc/security/limits.conf
echo "* hard nproc unlimited" >> /etc/security/limits.conf
echo "* soft    nproc     unlimited" >> /etc/security/limits.d/90-nproc.conf

 

创建 SSH 免交互登录

Ansible 通过 SSH 对设备进行管理,而 SSH 包含两种认证方式:一种是通过密码认证,另一种是通过密钥对验证。前者必须和系统交互,而后者是免交互登录。如果希望通过 Ansible 自动管理设备,应该配置为免交互登录被管理设备。

[root@centos01 ~]# ssh-keygen -t rsa  
<!--生成密钥对-->
Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa):
<!--密钥对存放路径-->
Created directory '/root/.ssh'.Enter passphrase (empty for no passphrase):       
<!--输入私钥保护密码,直接按Enter键表示无密码-->
Enter same passphrase again:    
<!--再次输入-->
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY root@centos01
The key's randomart image is:
+---[RSA 2048]----+
|          .   . .|
|       . . +   oo|
|      . = o o. oo|
|       = * o..+ *|
|      . S *.=+=*+|
|       . o =+XooE|
|        . ..=.++.|
|           ..o ..|
|           .. o. |
+----[SHA256]-----+
[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.20  
<!--复制公钥到远端192.168.100.20-->
[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.30    
<!--复制公钥到远端192.168.100.30-->

 

CP复制并重命名

cp test.rb{,.bak} #备份test.rb,并在尾部加上.bak后缀

 

grep -s 去掉 no such file or directory

 

 

grep -rn -s "xxxx"  ./    就不会打印出烦人的no such file or directory 了。

 

数组使用-逗号分割字符串为数组

# host="10.0.0.1,10.0.0.2,10.0.0.3"
# host=(${host//,/ })
# echo ${#host[*]}
3
# echo "${host[*]}"
10.0.0.1 10.0.0.2 10.0.0.3

 

数组使用-expect ssh配置免密钥

# cat mianmiyao_config 
hosts=hostname1,hostname2
passwd='test23!\@Test^&*','test23!\@Test^&*'

# cat mianmiyao.sh 
#!/bin/bash -x
source mianmiyao_config
yum -y install expect expect-devel
#rm -rf /root/.ssh/*
/usr/bin/expect -d <<-EOF
set timeout 100
spawn ssh-keygen -t rsa
expect {
"*id_rsa):" { send "\r"; exp_continue }
"*(y/n)?" { send "y\r"; exp_continue }
"*passphrase)*" { send "\r"; exp_continue }
"*again:" { send "\r"; exp_continue }
"*-------+" { send "\r"}
}
expect eof
EOF

hostsarr=(${hosts//,/ })
passwdarr=(${passwd//,/ })
num=${#hostsarr[@]}  
for((i=0;i<num;i++));  
do  
    /usr/bin/expect <<-EOF
    set timeout 100
    spawn ssh-copy-id ${hostsarr[i]}
    expect {
    "*(yes/no)?" { send "yes\r"; exp_continue }
    "*password:" { send "${passwdarr[i]}\r"; exp_continue }
    "*authorized_keys*" { send "\r"}
    }
    expect eof
    exit
EOF
done 

# cat mianmiyao.sh.test
#!/bin/bash -x
source ./mianmiyao_config

hostsarr=(${hosts//,/ })
passwdarr=(${passwd//,/ })
num=${#hostsarr[@]}  
echo $hostsarr,$passwdarr,$num
for((i=0;i<num;i++));  
do  
    echo ${hostsarr[i]}
    echo ${passwdarr[i]}
done 

# sh mianmiyao.sh.test
hostname1,test23!\@Test^&*,2
hostname1
test23!\@Test^&*
hostname2
test23!\@Test^&*

参考

写了个监控 ElasticSearch 进程异常的脚本!
https://mp.weixin.qq.com/s/KBb4JK8o3Z3NZJ8xJwv0HQ

OS命令--shell中数组的操作_数组_cloudcoder_InfoQ写作社区
https://xie.infoq.cn/article/a2de316e01067f2e42f316e46

 

Linux修改打开最大文件数和进程数

修改linux 打开最大文件数
echo "" >> /etc/security/limits.conf
echo "*    soft   nproc          65535" >>  /etc/security/limits.conf
echo "*    hard   nproc          65535" >>  /etc/security/limits.conf
echo "*    soft   nofile         65535" >>  /etc/security/limits.conf
echo "* hard   nofile         65535" >>  /etc/security/limits.conf
echo "" >> /etc/profile
echo "ulimit -n  65535" >> /etc/profile
echo "ulimit -u  65535" >> /etc/profile

最大进程数
vi /etc/security/limits.d/90-nproc.conf
echo "* soft nproc 65535" >> /etc/security/limits.d/90-nproc.conf
echo "root       soft    nproc     unlimited" >> /etc/security/limits.d/90-nproc.conf

 

shell中的#%*处理字符用法

#!/usr/bin/env bash
DIR="/dir1/dir2/dir3/abc.def.txt"
echo "DIR: $DIR"
 
#删除最左边/及其左边所有字符
PROCESS_NAME=${DIR#*/}
echo "#*/: $PROCESS_NAME"
 
#删除最右边/及其左边所有字符
PROCESS_NAME=${DIR##*/}
echo "##*/: $PROCESS_NAME"
 
#删除最左边.及其左边所有字符
PROCESS_NAME=${DIR#*.}
echo "#*.: $PROCESS_NAME"
 
#删除最右边.及其左边所有字符
PROCESS_NAME=${DIR##*.}
echo "##*.: $PROCESS_NAME"
 
 
#删除最右边/及其右边所有字符
PROCESS_NAME=${DIR%/*}
echo "%/*: $PROCESS_NAME"
 
#删除最左边/及其右边所有字符
PROCESS_NAME=${DIR%%/*}
echo "%%/*: $PROCESS_NAME"
 
#删除最右边.及其右边所有字符
PROCESS_NAME=${DIR%.*}
echo "%.*: $PROCESS_NAME"
 
#删除最左边.及其右边所有字符
PROCESS_NAME=${DIR%%.*}
echo "%%.*: $PROCESS_NAME"

输出结果:

DIR: /dir1/dir2/dir3/abc.def.txt
#*/: dir1/dir2/dir3/abc.def.txt
##*/: abc.def.txt
#*.: def.txt
##*.: txt
%/*: /dir1/dir2/dir3
%%/*: 
%.*: /dir1/dir2/dir3/abc.def
%%.*: /dir1/dir2/dir3/abc

总结:
        1.# 是去掉左边,%是去掉右边
        2.一个符号匹配首个字符;两个符号匹配所有字符最后那个

 

yum离线下载

Downloadonly
yum install yum-plugin-downloadonly
rpm -ql libXrender | cat -n

yum install --downloadonly --downloaddir=/usr/ttzz/yumdir/ libXrender
yum install --downloadonly --downloaddir=/usr/ttzz/yumdir/ libXext
yum install --downloadonly --downloaddir=/usr/ttzz/yumdir/ fontconfig

 

 

 

 


欢迎转载,转载请注明出处

 

 

posted @ 2018-06-06 12:53  paul_hch  阅读(726)  评论(0编辑  收藏  举报