⤴Top⤴

Linux 常用命令

博客分类: 后端

Linux 常用命令

Linux 常用命令

常用命令

基本的文件操作和查看命令可参考前一篇博客 👈

命令 描述 栗子
yum 包管理工具 yum search/install/remove ...
grep 文本搜索 grep '^tate' filename
ps 查看进程 ps -ef
lsof 列出当前系统打开文件的工具 lsof -i:4000
kill 终止进程 kill -9
find 指定目录下查找文件 find . -name '*.txt'
tr 对字符进行替换、压缩和删除 echo "HELLO" | tr 'A-Z' 'a-z'
pwd 以绝对路径的方式显示用户当前工作目录 pwd
whoami 查看当前有效用户名 whoami
date 显示或设置系统时间与日期 date +"%Y-%m-%d"
mount 挂载,umount 接触挂载 mount -t cifs -o ...
scp Linux 之间复制文件和目录 mount -t cifs -o ...
alias 设置命令的别名 scp [可选参数] file_source file_target
say macOS 系统中激活语音合成系统 say -v Ting-Ting hello

yum

针对 yum/apt-get/rmp/dpkg 等命令作区分,通过 linux 分为两大系列:

系列 RedHat 系列 Debian 系列
常用安装包格式 rmp deb
安装包命令 rmp -参数 dpkg -参数
包管理工具 yum apt-get
栗子 Redhat、Centos、Fedora 等 Debian、Ubuntu 等

下面着重介绍几个知识点:

homebrew

homebrew 上面已经说到了是用 ruby 开发的 macOS 的包管理系统,常用的命令总结如下,更多可以参考官方文档:

# install
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 更新 brew 本身
brew update
# 查看需要更新的包,并且会显示当前版本和最新版本号对照
brew outdated

brew search $FORMULA  # 搜索包
brew install $FORMULA # 安装包
brew list             # 列出已安装包

brew upgrade             # 更新所有的包
brew upgrade $FORMULA    # 更新指定的包

brew cleanup             # 清理所有包的旧版本
brew cleanup $FORMULA    # 清理指定包的旧版本
brew cleanup -n          # 查看可清理的旧版本包,不执行实际操作

brew pin $FORMULA      # 锁定包
brew unpin $FORMULA    # 取消锁定

brew info $FORMULA    # 显示包的信息
brew info             # 显示安装了包数量,文件数量,和总占用空间
brew deps --installed --tree # 查看已安装的包的依赖,树形显示

brew rm $FORMULA                # 删除包
brew uninstall --force $FORMULA # 删除所有版本

当然为了更方便使用,我们可以设置一些别名 alias:

bcubc='brew cask reinstall $(brew cask outdated) && brew cleanup'
bcubo='brew update && brew cask outdated'
bi='brew install'
brewp='brew pin'
brews='brew list -1'
brewsp='brew list --pinned'
bs='brew search'
bubc='brew upgrade && brew cleanup'
bubo='brew update && brew outdated'
bubu='bubo && bubc'

还有两种用法需要我们注意,一个是 brew cast,另一个是 brew tap:

命令中的 repo_name 其实是 brew tap <github_userid/homebrew-repo_name> 的简写,我们可以看到多了个 homebrew 的前缀,这个是和仓库名一致的

⚠️ brew cast 命令已经改成了 brew install --cask 👈

brew tap
# homebrew/cask
# homebrew/core
# mongodb/brew

brew install vim                     # installs from homebrew/core
brew install username/repo/vim       # installs from your custom repo

# 举个安装 Elasticsearch 的栗子
brew tap elastic/tap
brew install elastic/tap/elasticsearch-full

那么问题来了,如果第三方和 homebrew/core 的安装包名称重复了怎么办?这时候就需要看下下载优先级了。当你使用 brew install 这个命令时,brew 其实会将按照下面的顺序去查找哪个 formula(tap) 将被使用:

  1. pinned taps
  2. core formulae
  3. other taps

因此,如果我们想优先下载第三方的同名包,必须先通过下面命令 tap-pin 去 pin 这个仓库:

brew tap-pin username/repo # pin 仓库
brew tap-unpin username/repo # unpin 仓库

cURL & HTTPie

这里主要再介绍一下 HTTPie,引用官方的说法:

# 安装 brew install httpie
http [flags] [METHOD] URL [ITEM [ITEM]]
Item Type Description
HTTP Headers Name:Value Arbitrary HTTP header, e.g. X-API-Token:123.
URL parameters name==value Appends the given name/value pair as a query string parameter to the URL. The == separator is used.
Data Fields field=value, field=@file.txt Request data fields to be serialized as a JSON object (default), or to be form-encoded (--form, -f).
Raw JSON fields field:=json, field:=@file.json Useful when sending JSON and one or more fields need to be a Boolean, Number, nested Object, or an Array, e.g., meals:='["ham","spam"]' or pies:=[1,2,3] (note the quotes).
Form File Fields field@/dir/file Only available with –form, -f. For example screenshot@~/Pictures/img.png. The presence of a file field results in a multipart/form-data request.

HTTPie is a command line HTTP client with an intuitive UI, JSON support, syntax highlighting, wget-like downloads, plugins, and more.

httpie

# 省略 GET
http https://jsonplaceholder.typicode.com/posts/1
curl https://jsonplaceholder.typicode.com/posts/1 -i

# GET
 http https://example.com/api token:xx id==1 page==1 limit==5

# PUT
# Custom HTTP method, HTTP headers and JSON data
http PUT https://jsonplaceholder.typicode.com/posts/1 title=tate age:=100 X-API-Token:123

# 当然也支持下载文件 -d === --download
http -d www.example.com/my_file.zip

# form
http --form POST httpbin.org/post name='John Smith'
http --multipart POST https://example.com/login token:xxx email=smd.tate@gmail.com password=123 ids='[1765549]' arr:='["dress198"]'

# localhost 的简写,相当于 http localhost:4000
http :4000
http PUT httpbin.org/put \
    name=John \                        # String (default)
    age:=29 \                          # Raw JSON — Number
    married:=false \                   # Raw JSON — Boolean
    hobbies:='["http", "pies"]' \      # Raw JSON — Array
    favorite:='{"tool": "HTTPie"}' \   # Raw JSON — Object
    bookmarks:=@files/data.json \      # Embed JSON file
    description=@files/text.txt        # Embed text file

# output
PUT /person/1 HTTP/1.1
Accept: application/json, */*;q=0.5
Content-Type: application/json
Host: httpbin.org

{
  "age": 29,
  "hobbies": [
  "http",
  "pies"
],
"description": "John is a nice guy who likes pies.",
"married": false,
"name": "John",
"favorite": {
    "tool": "HTTPie"
  },
  "bookmarks": {
    "HTTPie": "https://httpie.org",
  }
}

如果要添加请求头参数,则需要遵循 Header:Value 的拼接规则:

http httpbin.org/headers  User-Agent:Bacon/1.0  'Cookie:valued-visitor=yes;foo=bar' X-Foo:Bar  Referer:https://httpie.org/

GET /headers HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: valued-visitor=yes;foo=bar
Host: httpbin.org
Referer: https://httpie.org/
User-Agent: Bacon/1.0
X-Foo: Bar

对比于 curl 给个栗子:

curl --location --request POST 'http://exmample-api.com/user' \
--header 'token: xxxxxx' \
--header 'Content-Type: application/json' \
# --data-raw '["516329"]'
--data-raw '[
  {"fieldA": "swblouse00200409568","fieldB": 1106567}
]'
# --form 'goods_ids=[510285,470598]'

grep

grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,常用的参数如下:

grep "match_pattern" file_name
# -v 反向查找
grep -v "match_pattern" file_name
grep '^chmod' test.txt
# chmod 用法
# chmod a=rwx file
# chmod 777 file
# chmod ug=rwx,o=x file
# chmod 771 file

ps

ps 命令用于查看进程,常用的参数为:

ps -af
# UID   PID  PPID   C STIME   TTY           TIME CMD
#   0 46292 15100   0 Tue11AM ttys000    0:00.04 login -pf tate
# 501 46293 46292   0 Tue11AM ttys000    0:01.31 -zsh

其中 UID 是用户身份证明,PID 是进程识别号,PPID 是上级父进程的识别号。通常配合 grep 命令查找:

ps -ef | grep vim
# 501 64513 64386   0 12:51PM ttys003    0:00.04 vim test.txt

符号 | 是管道命令操作符,可以传递给下一个命令,作为标准的输入。它只能处理经由前面一个指令传出的正确输出信息,对错误信息信息没有直接处理能力。之后也可以通过 kill 命令删除执行中的程序或工作:

# kill [PID] 删除指定进程
kill 64513

lsof

lsof(list open files) 列出当前系统打开文件的工具,通过 -i 参数可以列出符合条件的进程:

lsof -i:4000
# COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
# ruby    56525 tate    9u  IPv4 0x28babd01c639a281      0t0  TCP localhost:terabase (LISTEN)

kill

kill 根据进程 PID 进行终止,该命令是通过向进程发送指定的信号来结束相应进程的,通过 kill -l 可以列出所有的信号。只有第 9 种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。下面是常用的信号:

信号 信号对应数值 描述
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + )
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与 STOP 相反, fg/bg 命令)
STOP 19 暂停(同 Ctrl + Z)
# 强制终止指定进程
kill -9 56525

find

find 用来在指定目录下查找文件,不设置任何参数时,将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

# 查找 home 目录下以 .txt 结尾的文件名
find /home -name "*.txt"

# 查找 home 目录下不以 .txt 结尾的文件名
find /home ! -name "*.txt"

# 查找当前目录下以 .txt 或 .pdf 结尾的文件名
find . -name "*.txt" -o -name "*.pdf"

如果只查找当前目录,而不包括子目录的时候:

# -maxdepth 后的数字即使查找的目录层级
find . -name '*.sh' -maxdepth 1

还可以根据文件类型进行搜索:

find . -type 类型参数(f 是普通文件、d 是目录)
# 搜索最近七天内被访问过的所有文件
find . -type f -atime -7

# 搜索大于 10KB 的文件
find . -type f -size +10k

tr

tr 用来对字符进行替换、压缩和删除,参数为:

转换大小写:

echo "HELLO WORLD" | tr 'A-Z' 'a-z'
# hello world

删除所匹配的字符:

echo "hello 123 world 456" | tr -d '0-9'
# hello  world

压缩字符:

echo "thissss is      a text linnnnnnne." | tr -s ' sn'
this is a text line.

date

date 用来显示或设置系统时间与日期,用法为 <+时间日期格式>,指定显示时使用的日期时间格式:

date +"%Y-%m-%d"
# 2018-04-16

例如检查某个命令花费的时间:

start=$(date +%s)
nmap man.linuxde.net &> /dev/null

end=$(date +%s)
difference=$(( end - start ))
echo $difference seconds.

mount

mount 用来挂载资源以供访问,卸载则为 unmount,常用的方式为:

mount -t 类型 -o 挂接方式 源路径 目标路径

一般情况下要是访问 Windows 文件共享,则类型采用 cifs,详情查看此篇博客,目标路径一定要在挂载前创建,否则报错:

# 挂载
mount -t cifs -o username=591550,password=Bestsfer20175 //10.88.1.8/test $reportletMnt

# 卸载
umount /dev/hda5
# –l 参数并不是马上卸载,而是在该目录空闲后再卸载,可以解决 device busy 的问题,当然你也可以查询到进程并 kill 掉
umount -l /mnt/hda5

scp

scp 命令用于在 linux 之间复制文件和目录,具体的参数说明可以参考这里 👈:

scp [可选参数] file_source file_target
# 从本地复制到远程, 如果是目录的话加 -r 参数
scp local_file remote_username@remote_ip:remote_file
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music

使用 scp 命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则 scp 命令是无法起作用的

alias

alias 用来设置命令的别名,只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的 alias 命令存放到 ~/.bash_profile 中,若不存在该文件的话可以手动创建。unalias 可删除别名。

alias 新的命令='原命令 -选项/参数'
alias ll='ls -al'

say(macOS)

say 是 macOS 系统中独有的,不加参数的情况下使用系统默认语音。

say hello

say -v Ting-Ting 我是中国女声
say -v Mei-Jia 我是台湾女声
say -v Daniel i am Daniel

TIPS: 通过快捷键 Ctrl+R 可以更快搜索历史命令 👈

参考链接

  1. Linux 命令大全
  2. Linux Shell 脚本攻略
  3. yum 与 rpm、apt 的区别:rpm 的缺陷及 yum 的优势 By pig2
  4. Mount 挂载命令使用方法
  5. HTTPie 官方文档
  6. Why I chose HTTPie instead of cURL on the Command Line for HTTP APIs