套路
如果调查一个服务不可用
系统相关
查看操作系统状况
查看cpu信息
cat /proc/cpuinfo
查看Linux内核版本命令(两种方法):
1、cat /proc/version
[root@localhost ~]# cat /proc/version
Linux version 2.6.18-194.8.1.el5.centos.plus (mockbuild@builder17.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Wed Jul 7 11:50:45 EDT 2010
2、uname -a
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.18-194.8.1.el5.centos.plus #1 SMP Wed Jul 7 11:50:45 EDT 2010 i686 i686 i386 GNU/Linux
查看Linux系统版本的命令(3种方法):
1、lsb_release -a,即可列出所有版本信息:
[root@localhost ~]# lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.5 (Final)
Release: 5.5
Codename: Final
这个命令适用于所有的Linux发行版,包括Redhat、SuSE、Debian…等发行版。
2、cat /etc/redhat-release,这种方法只适合Redhat系的Linux:
[root@localhost ~]# cat /etc/redhat-release
CentOS release 5.5 (Final)
3、cat /etc/issue,此命令也适用于所有的Linux发行版。
[root@localhost ~]# cat /etc/issue
CentOS release 5.5 (Final)
Kernel \r on an \m
Linux下有7个运行级别:
- 0系统停机模式,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭。
- 1单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。
- 2多用户模式,没有NFS网络支持。
- 3完整的多用户文本模式,有NFS,登陆后进入控制台命令行模式。
- 4系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
- 5图形化模式,登陆后进入图形GUI模式,X Window系统。
- 6重启模式,默认运行级别不能设为6,否则不能正常启动。运行init 6机器就会重启。
计划任务工具
crontab
给路径起别名 alias
找到用户的根目录
vim .bashrc
增加一行
alias xx='cd /home/luxiaoshuai/linux'
执行生效
source .bashrc
(全局的话修改 /etc/bashrc 文件)
(单次会话的话,直接用alias 即可)
查看所有的环境变量
env
- 设置整体环境变量
vim /etc/profile
使环境变量生效(以下两种皆可):
. /etc/sysconfig/i18n
source /etc/sysconfig/i18n
查看或变更语言包
查看所有语言包
locale -a
权限相关
将用户添加到某个组
usermod -G [group] [user]
将文件夹权限赋于某组
chgrp -R wedefend /data2
更改文件夹权限所属
chown 用户名 文件名 -R
查看系统资源占用情况
TOP 查看内存和CPU占用情况
[root@iZ2570fkao7Z ~]# top
top - 15:45:30 up 1169 days, 22:14, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 76 total, 1 running, 75 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1018600k total, 935772k used, 82828k free, 286072k buffers
Swap: 0k total, 0k used, 0k free, 295876k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21362 mysql 20 0 710m 55m 4080 S 0.0 5.6 83:22.24 mysqld
18686 root 20 0 2252m 154m 13m S 0.0 15.5 65:55.61 java
- 按 M 按内存占用排序
- 按 P 按CPU占用排序
- 按 T 按进程启动时间排序
- 按 1 查看各个cpu情况
- top 后面是当前时间,load everage 是负载(5,10,15 分钟)满负荷状态的数字为 1*cpu核心数量
- 详细列表里RES是指的纯内存,不含虚拟内存。
- Tasks 里的total是总进程数,us是用户使用的,sy是系统使用的,sleep是正在休眠的,zombie是僵尸进程
[root@iZ2570fkao7Z ~]# free -m
total used free shared buffers cached
Mem: 994 886 108 0 132 433
-/+ buffers/cache: 321 673
Swap: 0 0 0
这里的mem一行,代表物理内存,swap 一行代表虚拟内存。
total 表示总内存
used 表示已经使用的内存
free 表示未使用的内存
由于linux的特性,总是尽可能的多使用内存。所以真正的内存应该是:
真正可使用内存 = free + shared + buffers
真正已使用内存 = used - shared - buffers
如果swap 被使用超过20%的话,不是好现象,可以考虑增加物理内存,因为速度相差悬殊。
Java 相关
找到Java 进程的PID
先使用ps -ef | grep java
或使用 jps -lv
-lv不加也可以
[root@iZ2570fkao7Z ~]# jps
9475 Jps
21550 Bootstrap
[root@iZ2570fkao7Z ~]# jps -lv
9497 sun.tools.jps.Jps -Denv.class.path=.:/home/jdk/jdk1.8.0_101/lib.tools.jar -Dapplication.home=/home/jdk/jdk1.8.0_101 -Xms8m
21550 org.apache.catalina.startup.Bootstrap -Djava.util.logging.config.file=/home/web/apache-tomcat-pic/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/home/web/apache-tomcat-pic -Dcatalina.home=/home/web/apache-tomcat-pic -Djava.io.tmpdir=/home/web/apache-tomcat-pic/temp
后使用jmap查看使用情况
jmap -histo 21550
2202: 1 16 sun.security.x509.RFC822Name
2203: 1 16 sun.text.normalizer.NormalizerBase$Mode
2204: 1 16 sun.text.normalizer.NormalizerBase$NFCMode
2205: 1 16 sun.text.normalizer.NormalizerBase$NFDMode
2206: 1 16 sun.text.normalizer.NormalizerBase$NFKCMode
2207: 1 16 sun.text.normalizer.NormalizerBase$NFKDMode
2208: 1 16 sun.util.calendar.Gregorian
2209: 1 16 sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar
2210: 1 16 sun.util.locale.provider.AuxLocaleProviderAdapter$NullProvider
2211: 1 16 sun.util.locale.provider.CalendarDataUtility$CalendarWeekParameterGetter
2212: 1 16 sun.util.locale.provider.SPILocaleProviderAdapter
2213: 1 16 sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
2214: 1 16 sun.util.resources.LocaleData
2215: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total 409157 34485064
第一列,序号。无实际意义
第二列,对象实例数量
第三列,对象实例占用总内存数。单位:字节
第四列,对象实例名称
最后一行,总实例数量与总内存占用数
使用jmap -heap 查看jvm状况
[root@iZ2570fkao7Z ~]# jmap -heap 21550
Attaching to process ID 21550, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.101-b13
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 262144000 (250.0MB)
NewSize = 5570560 (5.3125MB)
MaxNewSize = 87359488 (83.3125MB)
OldSize = 11206656 (10.6875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 14745600 (14.0625MB)
used = 13253056 (12.63909912109375MB)
free = 1492544 (1.42340087890625MB)
89.87803819444444% used
Eden Space:
capacity = 13172736 (12.5625MB)
used = 12961952 (12.361480712890625MB)
free = 210784 (0.201019287109375MB)
98.39984647077114% used
From Space:
capacity = 1572864 (1.5MB)
used = 291104 (0.277618408203125MB)
free = 1281760 (1.222381591796875MB)
18.507893880208332% used
To Space:
capacity = 1572864 (1.5MB)
used = 0 (0.0MB)
free = 1572864 (1.5MB)
0.0% used
tenured generation:
capacity = 32505856 (31.0MB)
used = 22902448 (21.841476440429688MB)
free = 9603408 (9.158523559570312MB)
70.45637561428931% used
18094 interned Strings occupying 2229112 bytes.
查看进程中堆栈的使用信息
jstack -l 21550 | vim -
配置相关
打开端口供外界访问
cd /etc/sysconfig/
vi iptables
添加以下行
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
service iptables restart
重启ssh服务
service sshd restart
ssh 免密码登陆
第一步:在本地机器上使用ssh-keygen产生公钥私钥对
$ ssh-keygen
第二步:用ssh-copy-id将公钥复制到远程机器中
$ ssh-copy-id -i .ssh/id_rsa.pub 用户名字@192.168.x.xxx
注意: ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.文件中
第三步: 登录到远程机器不用输入密码
$ ssh 用户名字@192.168.x.xxx
crontab中如何实现每隔多少天执行一次脚本
下面是每隔多少分钟,每隔多少小时,每天/每周/每月/每年的crontab的归纳总结
- 每五分钟执行 */5 * * * *
- 每五小时执行 0 */5 * * *
- 每天执行 0 0 * * *
- 每周执行 0 0 * * 0
- 每月执行 0 0 1 * *
- 每年执行 0 0 1 1 *
如果说是每个月的每隔10天来执行某个脚本的话,同样可以写成:
#每个月的1号,11号,21号,31号,执行HTTP服务重启
0 0 */10 * * /etc/init.d/apache2 restart
#每天清空日志
0 0 * * * rm -f /logs/ApplogsServer.log*
常用调查命令
查看当前系统进程
ps -ef | grep tomcat
根据进程ID查看端口号
netstat -ntlp | grep 1234
显示某端口占用的进程情况
lsof -i :端口
显示所有端口(配合grep使用)
netstat -ntlp
生成进程代码文件
当使用临时文件进行进程交互时,可以使用 做 为 文 件 名 , e g . t o u c h 做为文件名,eg. touch 做为文件名,eg.touch 是生成一个进程代码的文件
watch 持续监控
watch -n1 'lsof -p 123412 | grep sock'
查看历史命令
history(查看历史命令)
!100 (执行历史命令中第100条命令)
!!(执行上一条命令)
vi /etc/motd(显示shell 登陆进去的信息)
日期格式化
date +%Y/%m/%d
2015/11/30
date +%H:%M
21:53
显示当前时间秒数
date +%s
显示指定日期时间秒数
date -d '2018-03-27 10:40:01' +%s
把秒数转换成标准时间格式
date -d @1233631748
修改日期:
时间设定成2014年6月20日的命令如下:
#date -s 06/20/2014
修改时间:
将系统时间设定成下午14点20分00秒的命令如下。
#date -s 14:20:00
创建一个临时的HTTP Server (指定端口)
nc -l 8080
python -m http.server 7000
在python2.6里启动CGI服务命令:
python -mCGIHTTPServer 8080
在python3.4里则是:
python3.4 -m http/server --cgi 8080
以下为2.x
后台执行
nohup python -m CGIHTTPServer 8088 &
简单Post访问如下
curl -d'{account:10086}' 'localhost:8888/cgi-bin/mock.py'
想要Python支持post请求可以在目录下新建 cgi-bin , 并建一个py文件
#!/usr/bin/python
print "Content-Type: text/html" # headers
print # blank line, end of headers
print "{account:13400000000}" # content
以下可选
# -*- coding: UTF-8 -*-
GET 带参数
curl 'localhost:8888/cgi-bin/mock.py?name=bruce&id=1001'
mock.py
#!/usr/bin/python
import cgi
form = cgi.FieldStorage()
name = form.getvalue('name')
id = form.getvalue('id')
print "Content-Type: text/html" # headers
print # blank line, end of headers
print '{'
print '"name":"{}","id":"{}"'.format(name,id)
print '}'
Post 带参数
curl -d'{"name":"dd","id":"888"}' 'localhost:8888/cgi-bin/mock.py'
mock.py
#!/usr/bin/python
import cgi
import sys
import json
import os
con = int(os.environ["CONTENT_LENGTH"])
req_body = sys.stdin.read(con)
my_dict = json.loads(req_body)
print "Content-Type: text/html" # headers
print # blank line, end of headers
print '{'
print '"name":"{}","id":"{}"'.format(my_dict["name"],my_dict["id"])
print '}'
后面的80端口是可选的,不填会采用缺省端口8000。注意,这会将当前所在的文件夹设置为默认的Web目录,试着在浏览器敲入本机地址 http://localhost:80
如果当前文件夹有index.html文件,会默认显示该文件,否则,会以文件列表的形式显示目录下所有文件。这样已经实现了最基本的文件分享的目的,你可以做成一个脚本,再建立一个快捷方式,就可以很方便的启动文件分享了。如果有更多需求,完全可以根据自己需要定制,具体的请参见官方文档SimpleHTTPServer
查看端口
netstat -tuln
自动设置密码
echo “abc123” | passwd --stdin bruce
监控tcp端口
tcpdump -i eth0 -nnA ‘port 9000’
监听指定的主机
$ tcpdump -i eth0 -nn 'host 192.168.1.231'
这样的话,192.168.1.231这台主机接收到的包和发送的包都会被抓取。
$ tcpdump -i eth0 -nn 'src host 192.168.1.231'
这样只有192.168.1.231这台主机发送的包才会被抓取。
$ tcpdump -i eth0 -nn 'dst host 192.168.1.231'
这样只有192.168.1.231这台主机接收到的包才会被抓取。
监听指定端口
$ tcpdump -i eth0 -nnA 'port 80'
上例是用来监听主机的80端口收到和发送的所有数据包,结合-A参数,在web开发中,真是非常有用。
监听指定主机和端口
$ tcpdump -i eth0 -nnA 'port 80 and src host 192.168.1.231'
多个条件可以用and,or连接。上例表示监听192.168.1.231主机通过80端口发送的数据包。
监听除某个端口外的其它端口
$ tcpdump -i eth0 -nnA '!port 22'
如果需要排除某个端口或者主机,可以使用“!”符号,上例表示监听非22端口的数据包。
执行另外一台机器上的命令
#!/bin/bash
echo "Server1:" && ssh abc@192.168.1.163 "grep Exception /log/Server.log"
echo
wget
直接输出到控制台方法一
wget http://www.baidu.com --output-document -
直接输出到控制台方法二
wget -qO- www.baidu.com
curl
静默访问(GET)
curl -s 'http://127.0.0.1:9010/abc/copyright?aeskey=1&filename=1&status=1'"
URLEncode访问(GET)
curl -H "Content-Type:application/json" -G --data-urlencode "port=4546&content=小dd" 'www.test.com'
POST提交
curl -H "Content-Type:application/json" -d '{ "account": "13400010008"}' "http://127.0.0.1:9090/sApplication"
研究所
管道运算是并发的
echo "1" >>aaa | grep 2 | echo "2" >>aaa
aaa文件里可能是
2
1
从ps -ef | grep abc就可以看出
结果里竟然包含grep的进程
是因为并发的原因
常用终端骚操作
- Ctrl – a :移到行首
- Ctrl – e :移到行尾
- Ctrl – b :往回(左)移动一个字符
- Ctrl – f :往后(右)移动一个字符
- Alt – b :往回(左)移动一个单词
- Alt – f :往后(右)移动一个单词
- Ctrl – xx :在命令行尾和光标之间移动
- M-b :往回(左)移动一个单词
- M-f :往后(右)移动一个单词
命令行编辑命令
- Ctrl – h :删除光标左方位置的字符
- Ctrl – d :删除光标右方位置的字符(注意:当前命令行没有任何字符时,会注销系统或结束终端)
- Ctrl – w :由光标位置开始,往左删除单词。往行首删
- Alt – d :由光标位置开始,往右删除单词。往行尾删
- M – d :由光标位置开始,删除单词,直到该单词结束。
- Ctrl – k :由光标所在位置开始,删除右方所有的字符,直到该行结束。
- Ctrl – u :由光标所在位置开始,删除左方所有的字符,直到该行开始。
- Ctrl – y :粘贴之前删除的内容到光标后。
- Alt + t :交换光标处和之前两个字符的位置。
- Alt + . :使用上一条命令的最后一个参数。
- Ctrl – _ :回复之前的状态。撤销操作。
Bang(!)命令
- !! :执行上一条命令。
- foobar :把上一条命令里的foo替换为bar,并执行。
- !wget :执行最近的以wget开头的命令。
- !wget:p :仅打印最近的以wget开头的命令,不执行。
- !$ :上一条命令的最后一个参数, 与 Alt - . 和 $_ 相同。
- !* :上一条命令的所有参数
- !*:p :打印上一条命令是所有参数,也即 !*的内容。
- ^abc :删除上一条命令中的abc。
- foobar :将上一条命令中的 foo 替换为 bar
- foobar^ :将上一条命令中的 foo 替换为 bar
- !-n :执行前n条命令,执行上一条命令: !-1, 执行前5条命令的格式是: !-5
查找历史命令
- Ctrl – p :显示当前命令的上一条历史命令
- Ctrl – n :显示当前命令的下一条历史命令
- Ctrl – r :搜索历史命令,随着输入会显示历史命令中的一条匹配命令,Enter键执行匹配命令;ESC键在命令行显示而不执行匹配命令。
- Ctrl – g :从历史搜索模式(Ctrl – r)退出。
控制命令 - Ctrl – l :清除屏幕,然后,在最上面重新显示目前光标所在的这一行的内容。
- Ctrl – o :执行当前命令,并选择上一条命令。
- Ctrl – s :阻止屏幕输出
- Ctrl – q :允许屏幕输出
- Ctrl – c :终止命令
- Ctrl – z :挂起命令
文件操作相关
ls -l 详解
[root@iZ2570fkao7Z ~]# ll
total 3308
-rw-rw-r-- 1 root root 1334542 Sep 19 2018 0919
-rw-r--r-- 1 root root 108376 Sep 19 2018 0919.txt
- 第一个字符代表文件(-)、目录(d),链接(l)
- 其余字符每3个一组(rwx),读(r)、写(w)、执行(x)
- 第一组rwx:文件所有者的权限是读、写和执行
- 第二组rw-:与文件所有者同一组的用户的权限是读、写但不能执行
- 第三组r–:不与文件所有者同组的其他用户的权限是读不能写和执行
- 也可用数字表示为:r=4,w=2,x=1 因此rwx=4+2+1=7
- 1 表示连接的文件数
- root 表示用户
- root表示用户所在的组
- 1213 表示文件大小(字节)
- Feb 2 09:39 表示最后修改日期
- abc 表示文件名
ls/ll 显示文件时格式化
[root@iZ2570fkao7Z ~]# export TIME_STYLE="+%Y-%m-%d %H:%M:%S"
[root@iZ2570fkao7Z ~]# ll -t
total 1636
drwxr-xr-x 2 root root 4096 2018-03-01 15:46:42 t1
-rw-r--r-- 1 root root 10686 2018-01-17 16:33:27 a.zip
-rw-r--r-- 1 root root 14249 2018-01-17 16:33:10 shell.dat
-rw-r--r-- 1 root root 26730 2018-01-11 18:02:49 a
-rw-r--r-- 1 root root 35681 2018-01-11 18:02:35 xls.dat
drwxr-xr-x 3 root root 4096 2018-01-09 14:49:21 gfw
drwxr-xr-x 2 root root 4096 2017-11-24 17:37:39 keys
-rw-r--r-- 1 root root 668 2017-11-22 11:27:58 tooManyFiles.py
drwxr-xr-x 2 root root 4096 2017-10-24 11:32:40 tmp
drwxr-xr-x 5 root root 4096 2017-02-15 12:30:02 nltk_data
新建一个文件(夹)
touch fileName
cat > fileName (输入后按Ctrl + D 离开)
mkdir -p a/b/c (新建多层文件夹)
查看文件的编码以及属性
file [File Name]
[root@localhost ~]# file RSA解密私钥.txt
RSA解密私钥.txt: ASCII text, with very long lines, with no line terminators
转换文件的编码
Usage: iconv [OPTION...] [FILE...]
Convert encoding of given files from one encoding to another.
Input/Output format specification:
-f, --from-code=NAME encoding of original text
-t, --to-code=NAME encoding for output
Information:
-l, --list list all known coded character sets
Output control:
-c omit invalid characters from output
-o, --output=FILE output file
-s, --silent suppress warnings
--verbose print progress information
-?, --help Give this help list
--usage Give a short usage message
-V, --version Print program version
[root@localhost ~]# file RSA解密私钥.txt
RSA解密私钥.txt: UTF-8 Unicode text, with very long lines
[root@localhost ~]#
[root@localhost ~]# iconv RSA解密私钥.txt -t unicode -o rsa.txt
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# file rsa.txt
rsa.txt: Little-endian UTF-16 Unicode text, with very long lines
[root@localhost ~]# iconv RSA解密私钥.txt -t ascii -o rsa.txt
iconv: illegal input sequence at position 845
[root@localhost ~]# iconv RSA解密私钥.txt -t gb2312 -o rsa.txt
[root@localhost ~]# file rsa.txt
rsa.txt: ISO-8859 text, with very long lines
使用scp复制文件
pscp E:\javaWP\new.txt hollyfee@130.75.7.156:/home/hollyfee
文件压缩
总结
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、.tar.gz和.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压
将文件夹进行压缩(tar.gz)
tar -vc -f fileSystem.tar.gz fileSystem
将文件进行压缩(*.zip)
zip abc.zip abc
将文件夹进行压缩(*.zip)
zip -r fileSystem.zip fileSystem
解压tar文件
tar -xvf git-2.4.3.tar
解压 *.tar.gz 文件
tar -xvf fileSystem.tar.gz
解压ZIP文件
unzip fileSystem.zip
查看*.tar.gz 文件
tar -tv -f fileSystem.tar.gz
查看*.zip 文件
unzip -v fileSystem.zip
切割文件
[root@iZ2570fkao7Z ~]# cat data
1
2
3
4
5
6
7
8
9
0
[root@iZ2570fkao7Z ~]# split -d -l 2 data subdata
[root@iZ2570fkao7Z ~]# ll subdata*
-rw-r--r-- 1 root root 4 Sep 27 11:42 subdata00
-rw-r--r-- 1 root root 4 Sep 27 11:42 subdata01
-rw-r--r-- 1 root root 4 Sep 27 11:42 subdata02
-rw-r--r-- 1 root root 4 Sep 27 11:42 subdata03
-rw-r--r-- 1 root root 4 Sep 27 11:42 subdata04
[root@iZ2570fkao7Z ~]# cat subdata00
1
2
[root@iZ2570fkao7Z ~]# cat subdata01
3
4
subdata代表分割后文件的前缀
-d 代表文件后缀使用数字命名
-l 代表每2行就分割成一个文件
data是输入文件
合并文件
[root@iZ2570fkao7Z ~]# cat subdata* > subdata
Vim
vim 搜索选中的内容
- 【对中文无效】让光标停留在想要查找的单词的任意一个字母上面, 然后狂按Shift + *
- 按v转可视,选中后按y复制,然后输入 / (Ctrl + R) 0 ,回车, 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。
vim中执行外部命令
:! ls /home 暂时离开查看home下面有什么文件
vim修改以下文件即可转为相应的语言例如: jp_JP.utf-8
/etc/sysconfig/i18n
vi 显示行号
:set nu
使用vi编辑~/.vimrc文件,在该文件中加入一行"set nu",添加内容不含引号, 命令如下:
vi ~/.vimrc
vi/vim多行注释和取消注释
- 多行注释:
- 进入命令行模式,按ctrl + v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来
- 按大写字母I,再插入注释符,例如//
- 按esc键就会全部注释了
- 取消多行注释:
- 进入命令行模式,按ctrl + v进入 visual block模式,按字母l横向选中列的个数,例如 // 需要选中2列
- 按字母j,或者k选中注释符号
- 按d键就可全部取消注释
- vim选中多行
大写的V
vim 查找 "
:/\\"
VIM替换字符
从当前行开始将文件中所有的8080替换为8081,g代表全局,c代表确认
%s/8080/8081/gc
- vim分割窗口
vsp 分割窗口
按ctrl+w(按两次) 切换子窗口
- vim json 格式化
: . !python -m json.tool 将当前行转为json
: % !python -m json.tool 将当前文件转为json
: 1,4 !python -m json.tool 将1-4行转为json
- vim 插入外部执行命令
: r !date 插入当前时间
: 6,9 !sort 将6-9行进行排序并写回文件
#将起始行号和结束行号所指定的范围的内容作为命令command的输入。
#不会改变当前编辑的文件的内容
例如
:62,72 w !sort,将62行到72行的内容进行排序,但排序的结果并不会直接输出到当前编辑的文件中,而是显示在vim敲命令的区域
特殊的可以下面这么用
:62 w !bash,将会把第62行的内容作为bash命令来执行并显示结果,而且不会改变当前编辑的文件的内容
同样的:. w !bash,将当前行的内容作为bash命令来执行
例如52行内容为ls -l
那么输入:52 w !bash就跟执行!ls -l是一样的效果,如果你用的shell是bash shell
- 在vim 里打开新的vim并传入指定行
: 1,4 w !vim -
#加上w的话,是在外部执行,不会干扰当前文件内容。
- 文件浏览
ctrl +ws 横向切割窗口
ctrl +wv 纵向切割窗口
ctrl + c 返回命令模式,比esc快
:Sex 打开文件浏览器,选择其它文件打开
Shell
Shell实现简单的选择菜单
#!/bin/bash
for ((i=0;i<10;i++)) { echo " "; sleep 0.005;}
echo -e " 1.查看统计 " && echo ""
echo -e " 2.查看信息 " && echo ""
for ((i=0;i<10;i++)) { echo " "; sleep 0.005;}
read -p "input the number-->" M
if [ "$M" = "1" ] ;then
sh ./console.sh `date +%m-%d` `date -d '1 day' +%m-%d`
fi
if [ "$M" = "2" ] ;then
read -p "input the account--->" account
echo "try todo sth"
fi
在Shell中使用alias变量
添加声明
#!/bin/bash --login
shopt -s expand_aliases
让用户输入变量
read -p "【2017年】请输入开始日期(例如:11-24),默认从当天00:00:00开始算 " stime
判断输入的值
#!/bin/bash
# Parameter 1 Start Date
# Parameter 2 End Date
# 判断输入的值是否为空
if [ "$1" == "" ] ; then
echo "LoanId not found !!!";
exit;
fi
# 判断值的位数
para=$1
if [ ${#para} -lt "1" ] ;
then
echo Invalid Input!;
exit 1;
fi
if [ ${#para} -eq "11" ] ; then
query={\"account\":\"$para\"};
elif [ ${#para} -eq "18" -o ${#para} -eq "15" ]; then
query={\"detail.profile.cnid\":\"$para\"}
else
query={\"id\":\"$para\"}
fi
# 判断输入参数的个数 以及参数是否为空
if [ $# -lt 2 ] || [ ! -n $1 -a ! -n $2 ] ;then
read -p "请输入开始日期(例如:11-24),默认从当天00:00:00开始算 " stime
read -p "请输入结束日期(例如:11-25),默认从当天00:00:00开始算 " etime
else
stime=$1
etime=$2
fi
&& || 符号
ls a && (cd a; mkdir abc) (如果存在a文件夹则到其下面创建一个名为abc的文件夹)
ls ./abcd || mkdir abcd (如果不存在abcd文件夹则创建)
test命令
- test 1 -gt 0 ; echo $? 输出1是否大于0 (¥?代表上一条命令的执行结果 0 正确,1错误)
- [ 1 -gt 2 ] ; echo $? 同上操作test也可以用两个中括号来替换
- [ -e abc2.zip ] ; echo $? 判断abc2.zip是否存在
- 1)判断表达式
- 2)判断字符串
- 3)判断整数
- 4)判断文件
http://blog.csdn.net/benwang_/article/details/6799791
IF ELSE 一段小脚本
#!/bin/bash
#输出参数
echo First Parameter: $1
#输出参数
echo Second Parameter: $2
read -p "input your bank card: " pwd
if [ "$pwd" == "000000" ] ; then
echo "Balance Amount:100000.00"
elif [ "$pwd" == "999999" ]; then
echo "Balance Amount:100000.00"
else
echo "wrong pwd , fuck away..."
fi
CASE语句
#!/bin/bash
case $1 in
"1")
echo "account show"
;;
"2")
echo "open account"
;;
*)
echo "unknow function !"
;;
esac
定义函数
#!/bin/bash
#Accept 2 parameters
function printStr() {
echo $1
echo $2
}
printStr lu xiaoshuai
PS: 方法要在使用前声明,调用方法时不必加括号。
until 循环
#!/bin/bash
#直到输入ff 或者 qingqing 时才停止
echo $sber
until [ "$sber" == "ff" -o "$sber" == "qingqing" ]
do
read -p "Who is SB :" sber
done
echo "Yes ... you are so cool !"
while循环
#!/bin/bash
read -p "how old FF : " age
while [ "$age" -lt 35 ]
do
read -p "one more try -> how old FF : " age
done
echo "Good Job man !!!"
Shell 判断参数是否为空
if [ -z $1 ] ;then
echo "ERROR please input parameters ! " && exit 0 ;
fi
逻辑非 ! 条件表达式的相反
if [ ! 表达式 ]
if [ ! -d
n
u
m
]
如
果
不
存
在
目
录
num ] 如果不存在目录
num]如果不存在目录num
逻辑与 –a 条件表达式的并列
if [ 表达式1 –a 表达式2 ]
逻辑或 -o 条件表达式的或
if [ 表达式1 –o 表达式2 ]
- 脚本示例1
#!/bin/bash
cat show-data.conf | awk -F# '
BEGIN {
print "fuck";
while(getline line < "loanInfo.dat")
vars[substr(line,0,match(line," ")-1)]=substr(line,match(line," "));
while(getline line < "thirdparty.dat")
vars[substr(line,0,match(line,":")-1)]=substr(line,match(line,":")+1);
#output all value for check
for (obj in vars)
print obj,"",vars[obj]
}
{
for(i=1;i<=16;i++){
if($i!="") {
if(i%2==0){
gsub(/ $/,"",$i)
gsub(/^ /,"",$i)
printf(vars[$i])
} else {
printf ($i)
}
}
}
print "";
}'
查看当前环境支持的SHELL
[root@localhost bin]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh
列出当前系统的响应按键
stty -a
标准输出,错误输出
将正确的结果输出到right文件,错误的输出到error里
find /home -name .bashrc > ~/right 2>~/error
如果将正确和错误的都输出到一个文件呢
find /home -name .bashrc > ~/right 2>&1
将~/.bashrc输入到文件 _ 中
cat >_<~/.bashrc
cat >fileName<~/.bashrc
grep
匹配多个文件
grep "abc" Server.log*
通配符*匹配
Server.log
Server.log.2017.01.01
Server.log.2017.01.02
只显示匹配的部分
grep -o “lu[a-z]” data
其中lu[a-z]"为正则表达式
data为文件名
[root@iZ2570fkao7Z ~]# cat data
luxiao
liuxu
luze
liuqiangdong
zhangzetian
[root@iZ2570fkao7Z ~]#
[root@iZ2570fkao7Z ~]#
[root@iZ2570fkao7Z ~]#
[root@iZ2570fkao7Z ~]# grep -o "lu[a-z]" data
lux
luz
同时查询多个条件
ps -ef | grep -E "*S*|*App*|*abc*"
从多个文件中查找指定的字符串
find ./ -name "*log*" | xargs grep "1a35f848a2fa4674a98bssb473930003" -l
#./ 代表当前目录
#*log* 代表文件名包含Log的文件
#1a35f848a2fa4674a98b95b473930003 代表要搜索的字符串
#-l 代表列出命中的文件名,如果不加的话,会列出文件内容的
find
查找当前路径下文件名包含fileSystem的文件
find -name "*fileSystem*"
引号是一定要带的
查找/home路径下文件名包含fileSystem的文件
find /home -name "*fileSystem*"
find显示要查找文件的绝对路径
- find命令查询的结果使用绝对路径还是相对路径 与后面的路径名有关:
- 若路径名为绝对路径,则查询出的结果以绝对路径展示;
- 若路径名为相对路径,则查询出的结果以相对路径展示。
find `pwd` -name a.zip 显示要查找文件的绝对路径
linux中find查找指定时间段的文件并grep查找内容
find . -type f -newermt '2017-04-07 00:00:00' ! -newermt '2017-04-09 00:00:00' -exec grep "Exception" {} \;
find -newerXY file/time:XY为占位符,a、B、m、c、t分别代表上次访问时间、创建时间、上次modify时间、上次索引节点改变时间和绝对时间;find根据Y的值来计算file的某个时间戳,然后根据X的值来做匹配。t不能做X。
find . -type f -name "*log*" -newermt '2016-09-01 00:00:00' ! -newermt '2016-09-04 00:00:00' -exec grep "not hit" {} \; | grep "1a35f848a2fa4674a98b95b47393f815"
文件转Base64并存为文件名,可突破透明加密的封锁
base64 file.txt | tr -d "\n" |
awk '{a=1;while(substr($0,a,255)) {print substr($0,a,255);cmd="mkdir -p tmp/"substr($0,a,255) ;system(cmd);a+=255;} }'
AWK
awk少使用,最好转向python
内置变量
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔。 |
$0 | 完整的输入记录。 |
ARGC | 命令行参数的数目。 |
ARGIND | 命令行中当前文件的位置(从0开始算)。 |
ARGV | 包含命令行参数的数组。 |
CONVFMT | 数字转换格式(默认值为%.6g) |
ENVIRON | 环境变量关联数组。 |
ERRNO | 最后一个系统错误的描述。 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔)。 |
FILENAME | 当前文件名。 |
FNR | 同NR,但相对于当前文件。 |
FS | 字段分隔符(默认是任何空格)。 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配。 |
NF | 当前记录中的字段数。 |
NR | 当前记录数。 |
OFMT | 数字的输出格式(默认值是%.6g)。 |
OFS | 输出字段分隔符(默认值是一个空格)。 |
ORS | 输出记录分隔符(默认值是一个换行符)。 |
RLENGTH | 由match函数所匹配的字符串的长度。 |
RS | 记录分隔符(默认是一个换行符)。 |
RSTART | 由match函数所匹配的字符串的第一个位置。 |
SUBSEP | 数组下标分隔符(默认值是\034)。 |
awk基本格式
info awk //查看更多的具体信息
awk -F[分隔符] ‘BEGIN{}{}END{}’
其中BEGIN和END只执行一次, 中间的{}执行N次.
AWK单引号的使用(\047)
文件里单行是手机号,双行是Json串,要求格式式字符串。
cat old | awk '{if (NR%2==1) print $0; else system("echo \047"$0"\047 | python -m json.tool "); system("");}' > old.format
awk执行系统命令
awk '{system("echo 12345");}'
在awk里调用shell脚本并传参
awk '{command="sh sendRulesReport.sh "$0; system(command);}' ids.dat
ids.dat 如下
1001
1002
1003
1004
awk打印语句
打印某列以后的所有列
awk -F, '{for(i=4;i<=NF;i++){print $i}}'
默认换行打印
print "abc"
不换行打印
printf ""
awk显示第2行以后的数据
awk 'NR>2'
awk 文件操作
awk '
{
while (getline line < "res.dat")
{
res[line];
}
}
{
review="";
for (i in res) {
if (match(i,$2)) { split(i,sp,":"); review=sp[2]; }
};
if ($3=="review") {
print $1,$2,$3,review
}else {
print $1,$2,$3,$4
}
}
'
- res[line]; 文件行内容存到数组
- for (i in res) {} 循环数组
awk 数值操作
取模
for(i=1;i<=16;i++){
if(i%2==0) {
}
}
awk 字符串操作
将字符串i按照 : 分隔,保存到数据sp里面.
split(i,sp,":");
判断一个字符串里是否包含别一个字符串
awk '{if (match("abcdef","abc")) {print "----"}}'
output : ----
Note:
match("abcdef","abc")这个函数找到的话返回abc在abcdef中的位置,如果没找到返回0, awk中if (0) == false语句不会被执行
字符串替换
gsub(regular expression, subsitution string, target string);简称 gsub(r,s,t)
去掉字符串尾部的空格
gsub(/ $/,"",$i)
去掉字符串头部的空格
gsub(/^ /,"",$i)
awk 实现文件行变列
按着指定行数进行切割,存为csv文件。
源文件
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6
7 g 7
执行以下命令
awk 'BEGIN{row=4;system(sprintf("seq %d > report.csv",row))}{cmd=sprintf("sed -i \" %d s/$/,%s,%s,%s/\" report.csv",NR%row==0?row:NR%row,$1,$2,$3);system(cmd);}' data
formated
awk 'BEGIN{
row=4;
system(sprintf("seq %d > report.csv",row));
}
{
cmd=sprintf("sed -i \" %d s/$/,%s,%s,%s/\" report.csv",NR%row==0?row:NR%row,$1,$2,$3);
system(cmd);
}
' data
输出
[root@iZ2570fkao7Z 20200319]# cat report.csv
1,1,a,1,5,e,5
2,2,b,2,6,f,6
3,3,c,3,7,g,7
4,4,d,4
- 其中 BEGIN 必须加,不加会有歧义。
- sprintf 比较好用,可以用来拼接system函数的命令
- NR 代表当前行号
- awk 取模用 %
- seq 用来生成序列并存入文件,不提前创建好文件的话,sed 不好使
awk 分支/循环操作
if语句
if ($3=="review") {
print $1,$2,$3,review
}else {
print $1,$2,$3,$4
}
for语句循环数组
for (i in res) {
if (match(i,$2)) { split(i,sp,":"); review=sp[2]; }
}