Linux技巧收集
Contents
获取外网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 使用
一个小例子:
/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`"