获取外网IP

PUBLIC_IP=`wget http://ipecho.net/plain -O - -q ; echo`
echo $PUBLIC_IP

直接显示:
wget http://ipecho.net/plain -O - -q ; echo

查找历史命令

Ctrl+R

搜索

从当前目录,递归搜索”10.0.0.40”这个词

grep -rnw . -e "10.0.0.40"

毫秒转换成日期:

date -d @$(  echo "(1445930011000 + 500) / 1000" | bc)

十六进制转十进制

echo $((0xa))

10

十进制转十六进制

printf "%x\n" 10

a
➜  ~

运行进程与session不挂勾

nohup idea.sh > /dev/null 2>&1 &

查看某进程监听的端口

sudo ss -l -p -n | grep PID

sudo lsof -Pan -p PID -i

统计代码行数

find . -name "*.java" | xargs -P 0 wc -l | sort -k1 -n

不包括空行
find . -name "*.java" | xargs -P 0 sed '/^\s*$/d' | wc -l

统计列的总和

awk '{ sum+=$1} END {print sum}'

清除日志的脚本

#!/bin/bash
set -x

cd /tmp/test/

FILE_N="delete.file.list"

find . -type f \( -iname \*.log -o -iname \*.txt \) > ${FILE_N}
cat ${FILE_N} | xargs -t -n 1 -I {} -P 0 bash -c "split -d --bytes=100M --filter='gzip > \$FILE.gz' {} {} && rm -rf {}"

除了指定的文件名不处理

! -iname access.log

#!/bin/bash
set -x

cd /tmp/test/

FILE_N="delete.file.list"

find . -type f \( ! -iname access.log -iname \*.log -o -iname \*.txt \) > ${FILE_N}
cat ${FILE_N} | xargs -t -n 1 -I {} -P 0 bash -c "split -d --bytes=100M --filter='gzip > \$FILE.gz' {} {} && rm -rf {}"

find 1天以前修改的文件

find -mtime +1

find 1天之内修改的文件

find -mtime -1

mv 命令在脚本里的使用

cat ${MOVE_FILE_NAME} | xargs -t -n 1 -I {} -P 0 dirname {} | sort -u | xargs -t -n 1 -I {} -P 0 bash -c "mv {}/*.sync.gz \"${SAVE_DIR}{}/\""

删除匹配的字符串之间的行

#直接修改文件
sed -i '/no task start/,/no task end/d' ${ROOT}/target/ROOT/WEB-INF/classes/spring.xml

#不修改文件,只是将修改后的结果输出到stdout中
sed '/no task start/,/no task end/d' ${ROOT}/target/ROOT/WEB-INF/classes/spring.xml

查看进程启动时间

ps -p 25517  -o lstart

grep包含\的使用

有段数据,内容如下:
sdfsdf2e\x22bidfloor\x22:800,sldkfjsldkfslflsdf

然后想 grep 出 bidfloor\x22:800 这个内容,可以这样子:
cat test.file | grep -o "bidfloor\\\\\x22:[0-9]*"

注意,是5个\,即4个\加上\x22内容本身

显示每个进程的SWAP使用量

for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid:/{printf $1 " " $2 " " $3 " " $4 " " $5 " " $6}END{ print ""}' $file; done | sort -k 6 -n -r | less

Bash 00-23 遍历

for i in {00..23}; do
	echo ${i}
done

tar 忽略某文件或目录

tar -cvjf /path/to/xxx.tar.bz2 /path/to/backup --exclude=/path/to/dir --exclude=/path/to/file

注意,忽略目录时,目录的结尾不能有/结尾.

删除子字符串

从字符串string开头匹配pattern,并将匹配的删除
${string#pattern}

从字符串string结尾开始匹配pattern,并将匹配的删除
${string%pattern}

将秒数批量显示为日期

cat dd | grep -o "^[0-9]*" | xargs -n 1 -I{} echo {} | xargs -n 1 -P 1 -t -I{} date -d @{}

文件dd的内容如下:

1465712640
1465638231
...

在指定正则表达式的文件里搜索内容

time grep -rnw console_2016-06-14.1[0-9][0-9]*.log  -e "清除"

批量重命名

╭─sky@sky-linux /tmp/testbash  
╰─➤  ls
hello1.txt  hello2.txt  hello3.txt  hello4.txt  hello5.txt  hello6.txt  hello7.txt

将hello改为hello-new

╭─sky@sky-linux /tmp/testbash  
╰─➤  rename 's/hello/hello-new/' *.txt

╭─sky@sky-linux /tmp/testbash  
╰─➤  ls
hello-new1.txt  hello-new2.txt  hello-new3.txt  hello-new4.txt  hello-new5.txt  hello-new6.txt  hello-new7.txt

同步文件,然后再删除源文件

比如,我们想将日志文件迁移到某台服务器后,再删除源文件,以减轻磁盘占用空间.

#!/usr/bin/env bash

DEST_PORT=1850
DEST_DIR="/tmp/logs"
DEST_IP="1.2.3.4"
DEST_USER="sky"


SOURCE_DIR="/home/sky/share/unknown"
SOURCE_SUFFIX="*"


find ${SOURCE_DIR}  -mtime +1  -name "*.${SOURCE_SUFFIX}" | xargs -n 1 -I{} -P 2 rsync -R --remove-source-files -avzh "-e ssh -p ${DEST_PORT}" {} ${DEST_USER}@${DEST_IP}:${DEST_DIR}

如果有多个后缀的话,那要写成如下的形式

find . -mtime +1 -name "*.log" -o -mtime +1  -name "*.zip"

再如:

find /home/sky/tomcat/ -path "*logs*" -mtime +1 -name "*.log"  -o -path "*logs*" -mtime +1 -name "*.txt"  -o -path "*logs*" -mtime +1 -name "*.tmp"  | xargs -n 1 -P2 -I{} tar --remove-files -cvjf {}.tar.bz2 {} >> /tmp/compress.log

iptable 禁止外网访问某端口

eth1:就是外网所在的网卡号,请用 ifconfig 来查看.

sudo iptables -t filter -i eth1 -A INPUT -p tcp --dport 6606 -j REJECT
sudo iptables -t filter -i eth1 -A INPUT -p udp --dport 6606 -j REJECT

开机自动使iptables生效

sudo apt-get install iptables-persistent

如果修改了iptables的话, 要做如下修改:

sudo su -c 'iptables-save > /etc/iptables/rules.v4'
sudo su -c 'ip6tables-save > /etc/iptables/rules.v6'

归档日志, 并删除源文件

nohup bash -c " ls console_2016-06-30.*.log  | xargs -n 1 -P2 -I{} tar --remove-files -cvjf {}.tar.bz2 {} " > ~/compress-log.log &

rsync同步文件后并删除源文件

nohup bash -c " find /home/yourname/tomcat/logs/ -name \"*_[0-9][0-9][0-9][0-9]-*.log\"  | xargs -n 1 -P2 -I{} tar --remove-files -cvjf {}.tar.bz2 {} " >> /tmp/compress.log &


nohup bash -c " find /home/yourname/tomcat/logs/ -name \"*.bz2\"  | xargs -n 1 -P2 -I{} rsync -e \"ssh -p 你的ssh端口\" -avzh -R --remove-source-files {} yourname@yourIP:/remote/server/path " >> /tmp/rsync.log &

-R参数:表示相对在 /remote/server/path 目录下,再创建与源目录的相对路径.比如, 上同这样子,就会在远程服务器上创建如下类似的结构:

/remote/server/path/home/yourname/tomcat/logs

在文件的开头添加内容

╭─sky@sky-linux /tmp  
╰─➤  echo "hsdlf" > hello.txt
╭─sky@sky-linux /tmp  
╰─➤  sed -i "1iWorld" hello.txt 
╭─sky@sky-linux /tmp  
╰─➤  cat hello.txt 
World
hsdlf
╭─sky@sky-linux /tmp  
╰─➤  

替换字符串

将所有'0000-00-00 00:00:00替换为 1998-07-01 00:00:00'

sed -i "s/0000-00-00 00:00:00/1998-07-01 00:00:00/g" wb_status.data

查找文件的创建时间

# 查找文件的inode号码
ls -i file

# 根据inode来查看文件的crtime
╭─sky@sky-linux /ihome/db/postgresql/current/data/base/16384  
╰─➤  sudo debugfs -R 'stat <3022225>' /dev/sda1 
[sudo] password for sky: 
debugfs 1.42.9 (4-Feb-2014)

同步Tomcat


按自然排序

cat /tmp/xxx.log| sort -k4n

搜索文件然后对它进行处理

find . -name "*.js" -o -name "*.html" -o -name "*.map" -print0 -type f | xargs -0  sed -i 's/hello/world/g'

并,差,交集

并集

sort a.txt b.txt | uniq

交集

sort a.txt b.txt | uniq -d

-d表示显示有重复的

差集

sort a.txt b.txt b.txt | uniq -u

-u表示只显示没有重复的.

查看gcc搜索头文件的路径 xxx.h

gcc -v -E -

解压zip到指定文件名

unzip -p xxx.zip > hello.file

Enter passphrase for key

$ eval `ssh-agent -s`
$ ssh-add ~/.ssh/id_rsa_key
$ ssh-add -l
$ ssh  your-server

也可以将这些放到bashrc文件中.

将当前目录下的所有 git 仓库 pull 当前分支的最新代码

ls | xargs -I{} -n 1 bash -c "cd {};git pull origin \"$(git branch | grep -E '^\* ' | sed 's/^\* //g')\";git fetch --all"

列出所有正在监听的端口


sudo lsof -iTCP -sTCP:LISTEN

grep 某进程,然后kill掉


ps -ef | grep PROCESS | grep -v grep | awk '{print $2}' | xargs kill -9

检查磁盘是否是SSD


cat /sys/block/sda/queue/rotational

0:是SSD,1是HDD
或

sudo smartctl -a /dev/sdb
如果看到
Rotation Rate:    Solid State Device
就表明是SSD

查看网速

sar -n DEV 1 100

1:间隔1秒 100:共100次

logrotate 使用

logrotate

logrotate linux.die.net

一个小例子:

/home/emacsist/nginx/nginx-1.9.3/logs/*.log {
  daily
  compress
  nodelaycompress
  rotate 100
  size 1M
  notifempty
  missingok
  nocreate
  sharedscripts
  postrotate
    test ! -f /home/emacsist/nginx/nginx-1.9.3/logs/nginx.pid || kill -USR1 `cat /home/emacsist/nginx/nginx-1.9.3/logs/nginx.pid`
  endscript
}

多个文件和目录的话:

/var/log/basedir/*.log /var/log/basedir/*/*.log {
    daily
    rotate 5
}

处理 tomcat 日志

/home/yourUserName/tomcat/*/logs/catalina.out /home/yourUserName/tomcat/*/logs/*.log /home/yourUserName/tomcat/*/logs/*/*.log {
  copytruncate
  daily
  rotate 1000
  size 1M
  notifempty
  compress
  nodelaycompress
  missingok
  su yourUserName yourUserName
}

size 只有比这个大小大的才处理. M(大写M, 不是MB), G, k (小写k)

grep 以文件的形式保存匹配 pattern

grep -f pattern.file target.file

grep curl 的输出

curl -s  https://www.loldytt.com/Zuixingangju/AHJZBSRX/ 2>&1 | grep "thunder:" -a

根据 PID 来查找它所占用的端口

sudo lsof -Pan -p 5963 -i

将 p 后面的数值, 替换为你所要的 PID 进程ID即可.

查找空文件并删除

find  /tmp -type f -empty -user vivek -delete

grep 正则匹配中括号的内容(非贪婪模式)

head -n 100 analyze.json | grep -E '"rule":\[[^]]*]'
$ cat /tmp/test.grep.txt | grep -E '"rule":\[[^]]*]'
hello lsjfl skdfj slkf lsaf sak "rule":["151310"]
lsdjlfjsf s "rule":["150560","151223"]


$ cat /tmp/test.grep.txt | grep -E '"rule":\[[^]]*]' -o
"rule":["151310"]
"rule":["150560","151223"]

统计各TCP连接状态的数量

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

统计进程打开的文件句柄数

lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr

tar 打包

关于路径的问题, 一般打包时, tar 会按我们打包的路径进行打包的. 比如

tar -cvzf hello.tar.gz /home/emacsist/hello-test

这样子, 打包里的路径是 home/emacsist/hello-test, 假设我们在 /tmp 目录里, 解压这个文件时, 最后的路径为 /tmp/home/emacsist/hello-test

如果想让打包的路径, 仅仅是 hello-test 目录, 则可以这样子

tar -cvf gnupg2.tar.gz -C /home/emacsist hello-test

即 -C 参数来设置相对路径前缀, 后面的 hello-test 才是我们真正想打包的目录. 这样子, 打包里的路径, 就只是 hello-test 目录了.

查看外网TCP连接

[sudo] ss -t  | grep "`dig +short myip.opendns.com @resolver1.opendns.com`"