Linux常用命令汇总

## 命令行相关
代码行的艺术： https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md
解读代码： https://explainshell.com/
引号嵌套： https://stackoverflow.com/questions/24245661/unix-alias-fails-with-awk-command
### 关于yum
查看所有包的版本
`yum --showduplicates list XXXX`
查看现在直接装的版本
`yum list available XXXX –showduplicates`
查看已经装的内容
`yum list installed| grep ya-feed-batch`
装特定版本
`yum install <package name>-<version info>`
### 查看配置
- cpu： `lscpu`
- mem: `free -h`
- disk: `df -h`
  - mac: `diskutil list` `diskutil info -all`更有用
- file usage: `du -h --max-depth=1 PATH | sort -hr`
- os: `hostnamectl`, `lsb_release -a`

### 添加本地用户
```
$ sudo adduser cdp
$ sudo passwd cdp
# 添加到组
$ sudo gpasswd -a cdp wheel
# 确认
$ sudo lid -g wheel
```

### 查看本地用户和组，打印列表
```
cut -d: -f1,3,4 /etc/passwd
```
注意：通过这个方法找不到通过sssd同步过来的用户，想查看远程（例如ldap）用id, getent
```
id shyao
getent passwd shyao
```

### 查看DNS信息
```
$ nslookup <IP>
$ nslookup <HOSTNAME>
$ cat /etc/resolv.conf
```
或者
```
$ dig -x <IP> +short
$ dig <HOSTNAME> +short
```
这里的nslookup/dig只反应dns的查找路径，他是不看/etc/hosts
可以通过nsswitch.conf来查看host的查看顺序，
譬如下面：先看files（etc/hosts)再看dns
```
$ cat /etc/nsswitch.conf  | grep hosts
hosts:          files dns
```

### 查看系统信息
- 查看开机信息： `dmesg`
- 查看系统日志: `journalctl -x` `journalctl -u <service_name>`

### 查看线程
`ps auxww`
例：抓zoo的线程
`ps auxww | grep zoo`
### 查看服务端口
`sudo netstat -ltnp`


### vim常用
- 显示行号: `set number`
- 替换: `%s/shyao/usera/gc`


### 向另一个服务器传文件
scp命令
例：把本地的key文件传给服务器的指定目录
`scp syao.prod.keytab syao-dev01.ogk.ynwm.co.jp:/home/syao/`
传文件夹
scp -r 
例：现在需要拷贝一整个文件夹的内容
`scp -r /Users/syao/Downloads/mysql-metadata-storage syao-dev01.yas.ssk.ynwm..co.jp:/home/syao/druid-0.12.0/extensions`
rsync命令
`rsync -avz --exclude='.git' feed-ansible-druid gw104.cyan.ygrid.cc1:~/`
### 压缩文件
`tar -zcvf xxxx.tar.gz directory`
### 解压文件
`tar -zxvf <filename>`
z means (un)z̲ip.
x means ex̲tract files from the archive.
v means print the filenames v̲erbosely.
f means the following argument is a f̱ilename.
### 查看压缩内容
`tar -tvf <filename>`

### 更新压缩内容
`tar -rvf <target> <resource path>`

### 
### 查看文件（单纯查看）
less + 文件名
### 输出错误
`echo foo 2>&1`
### 同步文件
`rsync -az druid-0.12.0/ COORDINATION_SERVER:druid-0.12.0/`
### 查找当前目录下的文件和文件夹（不会查子目录）
`ls -l |grep yum`
### 查找指定目录下的全部文件（包含子目录）
例：全目录下找yum  
`sudo find / -name “yum.*”`
### 查找指定目录下的全部文件夹（包含子目录）
`find /（查找范围） -name '查找关键字' -type d`
### 进入root模式
`sudo su`
### 查找文件中的字符串
`grep -rnw '/path/to/somewhere/' -e 'pattern'`
Example: `grep -rnw '/home/syao/druid-0.12.0/log/' -e 'GET'`
### 字符串高亮（highlight）
`ack --passthru 'pattern1' file_name`
`command_here | ack --passthru 'pattern1'`
### 查找.gz文件中的字符串
`zgrep 'ERROR' XXX.log.gz | more`
### 查找并高亮（关键在less -p）
`grep a9c49cf077e96c3 server.log | less -p 'a9c49cf077e96c3'`
### mv同时移动多个文件至一个目录
`mv  a.dir  b.dir   c.dir  index.html  zz.txt  -t  idolaoxu `
`mv /path/sourcefolder/* /path/destinationfolder/`
### 跟踪文件的更新（常用于log）
`tail -f XXXX`
### 环境变量相关(path,lib)
查看全体
`printenv`
查看个别变量
`echo $XXX`
设置个别变量
`export XXX=$YYY`
`export PATH="$PATH:/path/to/dir"`
常用的变量
`PYTHONPATH`
设置快捷方式
例：希望所有的python3命令使用python36
`sudo ln -s /usr/bin/python3.6 /usr/bin/python3`
## shell相关
### 切换shell
```
chsh -s /bin/zsh
```
### 多行输入文件
- echo 不能输出多行，如果需要，那么请使用cat
- 被EOS夹着的部分默认语法和""双引号一致
- <<EOS使用时需要顶格

```
cat > ${rotate_job} << EOS
type=command
dependencies=XXXXX
q1=YYYYY
command=hostname
command.1=query_action --base_dir \${hql_base_dir} --file \${q1}
HCONF_tracking_id=${tid}
EOS
```
## Mac相关（和linux的不同点汇总）
### 复制粘贴
`pbcopy`, `pbpaste`

### xargs替换option
和linux的`-i`不同，是`-I`
### super user
和linux的`sudo su`不同，用`sudo -i`即可
### locate的使用
和linux的不同，用`mdfind`更方便
### lsof来监听端口(比netstat方便)
`lsof -iTCP -sTCP:LISTEN -P -n`
### netstatの使い方
`netstat -vanp tcp | grep 3000`
※参照：https://stackoverflow.com/questions/3855127/find-and-kill-process-locking-port-3000-on-mac

### pmset 电源电池选项
```ruby:查询当前配置
pmset -g custom
```

```ruby:禁止进入sleep
sudo pmset -a sleep 0
```


## python相关
### 关于导入lib
pip和brew，yum一样是用来装东西的。
pip装的东西是给python script用的。
所以.py里面有类似 `from flask import Flask, request, jsonify` 的语句，
直接运行 `pip3 install flask`即可。
### 虚拟环境（pip）
```
# 安装
pip install virtualenv
# 新建（venv是名字）
virtualenv venv
# 激活
. ./venv/bin/activate
# 关闭
deactivate
```
### 虚拟环境（python）
```
# 新建（第二个venv是名字）
python -m venv venv
# 激活
. ./venv/bin/activate
# 关闭
deactivate
```
### 查看安装包的版本
`/opt/python36/bin/pip3 show XXXX`