Linux常用命令

文章目录

套路

如果调查一个服务不可用

系统相关

查看操作系统状况

查看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 搜索选中的内容

  1. 【对中文无效】让光标停留在想要查找的单词的任意一个字母上面, 然后狂按Shift + *
  2. 按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多行注释和取消注释

  • 多行注释:
  1. 进入命令行模式,按ctrl + v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来
  2. 按大写字母I,再插入注释符,例如//
  3. 按esc键就会全部注释了
  • 取消多行注释:
  1. 进入命令行模式,按ctrl + v进入 visual block模式,按字母l横向选中列的个数,例如 // 需要选中2列
  2. 按字母j,或者k选中注释符号
  3. 按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]; }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值