【Linux】常用命令

2018年02月04日    Author:Guofei

文章归类: 0x11_算法平台    文章编号: 101


版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2018/02/04/linux.html

Edit

文件和目录

cd /home # 进入一个目录  
cd .. # 返回上一级目录  
cd ../.. # 返回上两级目录  
cd - # 返回上次所在的目录  

pwd # 显示工作路径  

# ls:查看
ls # 查看目录中的文件  
ls -F # 查看目录中的文件  
ls -l # 显示文件和目录的详细资料  
# 第一部分是drwxr-xr-x
# - d:这一项是文件夹
# - r:read读权限
# - w:write
# - x :执行权限
# - r-x:该用户所在用户组的权限
# - r-x:其它用户组的权限

ls -l # 显示的是修改时间 modification time
ls -l --time=atime # 显示最近访问时间 access time
ls -l --time=ctime # 显示 属性(如权限等)修改时间 status time

ls -a # 显示隐藏文件  
ls *[0-9]* # 显示包含数字的文件名和目录名  

tree # 显示文件和目录由根目录开始的树形结构
tree -d # 仅显示目录
tree -L n # n代表数字..表示要显示几层...
tree -f # 显示完整路径..

mkdir dir1 # 创建一个叫做 'dir1' 的目录
mkdir dir1 dir2 # 同时创建两个目录  
mkdir -p /tmp/dir1/dir2 # 创建一个目录树  

# rm: 删除
rm -f file1 # 删除文件
rm -rf dir1 # 删除一个叫做 'dir1' 的目录并同时删除其内容  
rm -rf dir1 dir2 #  同时删除两个目录及它们的内容  
rmdir dir1 # 删除目录,目录为空才行

mv dir1 new_dir # 重命名/移动 一个目录  
cp file1 file2 # 复制一个文件  
cp dir/* . # 复制一个目录下的所有文件到当前工作目录,不会复制子目录  
cp -a dir1 dir2 # 复制一个目录到另一个目录,包括子目录

ln -s file1 lnk1 创建一个指向文件或目录的软链接  
ln file1 lnk1 创建一个指向文件或目录的物理链接  

clear

clear # 清屏

进程相关

ps  # 查看进程
# -a 全部显示
# -u显示详细状态
# -x 显示没有控制终端的进程


top # 查看进程
# -M 根据内存陪许
# -P 根据CPU排序
# -T 根据进程时间
# q退出

kill [-signal] pid # 结束进程

权限相关

chgrp  # 改变文件所属群组
chown  # 改变文件拥有者
chmod  # 改变文件的权限, SUID, SGID, SBIT等等的特性
whoami # 显示当前用户
who # 显示所有用户

find

find / -name file1 # 从 '/' 开始进入根文件系统搜索文件和目录  
find / -user user1 # 搜索属于用户 'user1' 的文件和目录  
find /home/user1 -name \*.bin # 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件  
find /usr/bin -type f -atime +100 # 搜索在过去100天内未被使用过的执行文件  
find /usr/bin -type f -mtime -10 # 搜索在10天内被创建或者修改过的文件  
find / -name \*.rpm -exec chmod 755 '{}' \; # 搜索以 '.rpm' 结尾的文件并定义其权限  
find / -xdev -name \*.rpm # 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备  
locate \*.ps # 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令  
whereis halt # 显示一个二进制文件、源码或man的位置  
which halt # 显示一个二进制文件或可执行文件的完整路径  


# 案例:
# 删除空文件夹
find . type -d -empty|xargs rm -rf
# type -d 指的是类型为文件夹
# -empty 指的是空文件夹
# xargs 是把前一个命令的输出作为输入,例如 xargs -n 1 rm -f 读入一条数据

cat

cat  # 从上到下的顺序预览文件
# -b 打印行号,行号从 1 开始
# -n 打印行号,并且不跳过空白行

tac  # 从下到上的顺序预览文件,这个命令名本身也是 cat 颠倒过来

more file.txt  # 预览某个文件
# 按空格:翻到下一页
# 按回车:下一行
# /字符串:搜索下一个
# :f:显示当前行号
# q 退出
# b 往前翻

less file.txt  # 效果和 more 类似,但是更多功能


head -n 20 file.txt  # 显示前 20 行

tail -n 20 file.txt  # 显示后 20 行


od file.txt -ta  # 查看二进制文件
# -ta 以默认字符格式输出
# -tc 以 ASCII 码格式输出
# -td 十进制格式输出
# -to 八进制格式输出
# -tx 十六进制格式输出户

touch

# touch
touch
# -a 修改 atime 到现在
# -c 修改 ctime 到现在
# -m 修改 mdate 到现在
touch -d "2 days ago" file.txt # 修改到 2 天前
touch -t 0712250000 file1 # 修改一个文件或目录的时间戳 - (YYMMDDhhmm)  

另外,对于不存在的文件,touch 可以新建

案例:统计文件个数

# 统计当前文件夹下文件的个数
ls -l |grep "^-"|wc -l

# 统计当前文件夹下目录的个数
ls -l |grep "^d"|wc -l

# 统计当前文件夹下文件的个数,包括子文件夹里的
ls -lR|grep "^-"|wc -l

# 统计文件夹下目录的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l

解释

  • ls -l 列出文件和文件夹,ls -lR 递归列出文件和文件夹
  • grep "^-" 筛选出以横线开头的,grep "^d" 筛选出以d开头的
  • wc -l 计算有多少行

常用命令

时间

# 显示当前时间
date
# 按照指定的格式显示时间
date +%Y/%m/%d
date +%Y-%m-%d
date +%H:%M:%S


# 显示日历
cal
# 查询 2018/02 的日历
cal 02 2018



date +%Y-%m-%d --date '1 days ago'
DATE=$(date +%Y-%m-%d --date '1 days ago')

帮组

date --help
man date
# 在 man page 中,可以按 “/” 进入搜索功能。按 “q” 推出页面

history:显示最近的命令

history [-raw] histfiles
# 选项与参数:
# n :数字,意思是“要列出最近的 n 笔命令列表”的意思!
# -c :将目前的 shell 中的所有 history 内容全部消除
# -a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,
# 则默认写入 ~/.bash_history
# -r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
# -w :将目前的 history 记忆内容写入 histfiles 中!

登陆信息

登陆欢迎信息在 /etc/issue 

常用工具

# 打开一个简单的计算机
bc

开关机

# 将数据同步写入硬盘中
sync

# 关机
shutdown
重新开机,关机: reboot, halt, poweroff


shutdown [-krhc] [时间] [警告讯息]
    # -k : 不要真的关机,只是发送警告讯息出去!
    # -r : 在将系统的服务停掉之后就重新开机(常用)
    # -h : 将系统的服务停掉后,立即关机。 (常用)
    # -c : 取消已经在进行的 shutdown 指令内容。
    # 时间 : 指定系统关机的时间,默认 1 分钟
# 例子
shutdown -h 10 'I will shutdown after 10 mins'


reboot  # 系统重新开机
halt  # 系统停止~屏幕可能会保留系统已经停止的讯息
poweroff  # 系统关机,所以没有提供额外的电力,屏幕空白!

查看系统配置

uname -r  # 查看核心版本
uname -m  # 查看操作系统版本
uname  # 查看平台

硬盘

/dev/sd[a-p][1-128]:为实体磁盘的磁盘文件名;
/dev/vd[a-d][1-128]:为虚拟磁盘的磁盘文件名

看文件的 inode 信息

ls -li
df:列出文件系统的整体磁盘使用量;
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

打包和压缩文件

tar

tar 只是打包,不是压缩

tar -cf archive.tar file1 # 打包
tar -tf archive.tar # 显示包中的内容
tar -xf archive.tar # 解包

# -c 产生新的包
# -f 指定包的文件名
# -x 解包
# -r 往包内增加文件,-u 更新文件
# -t 列出文件
# -v 显示正在处理哪个文件


# 与压缩有关的:
# -z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
# -j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
tar -jcvf archive.tar.bz2 tmp # 打包压缩
tar -jtvf archive.tar.bz2 # 显示压缩包
tar -jxvf archive.tar.bz2 # 解压缩

tar有很多参数,下面列出常用的:

tar -cf all.tar * .jpg # 将所有.jpg的文件打成一个名为all.tar的包。
tar -uf all.tar logo.gif  # 更新原来tar包all.tar中logo.gif文件
tar -cvf archive.tar file1 file2 dir1 # 打包一个包含了 'file1', 'file2' 以及 'dir1'的档案文件

zip

zip -r FileName.zip DirName # 压缩
unzip FileName.zip # 解压

详情链接
可以比较一下Python的zip操作

程序结构

命令

设置别名

# 设置别名
alias guofei_ls='ls -la'

# 看一个命令是否是系统命令
type cd
type guofei_ls

换行符

# 反斜杠用来换行
cd\
path1

赋值

# 赋值
x=ls
# 1. 等号两边不能有空白
# 2. 变量名不能是数字开头
# 3. 被赋值的字符串如果有空格,必须加引号

# 4. 赋值可以嵌套,例如:
var="lang is $LANG"
echo ${var} # 显示:lang is zh_CN.UTF-8,可以理解为赋值的时候做了字符串替换,之后改变 LANG 变量也不会导致 var 被改变。

# 5. 等号右边加括号,表示右边是命令
x=$(ls)
echo $x # 显示之前的 ls 的返回


${x} -la
# 1. 前加$表示取出变量值,或者 $x 也有一样效果
# 2. 取出后可以作为命令的一部分直接使用,也可以显示:
echo $x

# 取消赋值
unset x

变量用于子程序

cd /lib/modules/$(uname -r)/kernel
# uname -r 代表 20.3.0
# 上面代表 cd 到 /lib/modules/20.3.0/kernel


export x='ls' # 加 export 后,可以被子程序使用
export # 单独的会吧所有变量都显示出来

一些环境变量

HOME # 用户主文件夹
SHELL # 所使用的 SHELL程序,Linux 默认是 /bin/bash
HISTSIZE # 可以记录多少历史命令
PATH # 变量目录
LANG # 语言
RANDOM # 0~32767 的随机数

read

# 用来读取用户输入
read [-pt] variable
# -p:后接提示字符
# -t:等待秒数

# 例子:
read -p "Please keyin your name in 30s: " -t 30 your_name
echo $your_name

declare

declare [-aixr] variable
# -a : array 类型
# -i :integer 类型
# 不支持浮点类型

# 例子:
x=100+200 # 其实是字符串加
declare -i x=100+200 # 这才是数字加

var[1]='a';var[2]='b'
echo "${var[1]},${var[2]}"

管道

cmd1 && cmd2  # cmd1 正确执行,则开始执行 cmd2
cmd1 || cmd2  # cmd1 执行且错误,则开始执行 cmd1

# 例子:
ls /tmp/vbirding && echo "exist" || echo "not exist"
# 若存在,这显示 exist,否则显示 not exist

cut:分割字符串,然后取出第n个

# cut -d '分隔字符' -f fields

echo $PATH |cut -d ':' -f 3
/home/guofei/anaconda3/bin
# 按冒号分割,然后取第3个

grep:搜索字符串

# -c : 返回匹配次数
# -v :反向选择(选择没匹配到的)
# -n : 附加行号

# 例如:寻找 txt 文件
ls -l|grep .txt

script

如何传参?

# file.sh
echo "param 0: ${0}"
echo "param 1: ${1}"
echo "param 2: ${2}"

调用 sh 文件

bash file.sh a b
# 结果:
# param 0: file.sh
# param 1: a
# param 2: b

可以用 shift 来偏移参数号(用的时候详查)

流程控制

if

if [ 条件 ]; then
  执行
fi


if [ 条件 ]; then
  执行
else
  执行
fi


if [ 条件 ]; then
  执行
elif [[ condition ]]; then
  #statements
else
  执行
fi


read ny;
if [ "${ny}" == "y" ]||[ "${ny}" == "Y" ];then
    echo "yes";
elif [ "${ny}" == "n" ]||[ "${ny}" == "N" ];then
    echo "no";
else
    echo "what?";
fi
# || 是或, && 是且

函数

function print_it(){
  echo "param 0: ${0}"
  echo "param 1: ${1}"
  echo "param 2: ${2}"
}

# 如何调用
print_it 1 2
# 打印:
# param 0: -bash
# param 1: 1
# param 2: 2

while 循环


while [[ condition ]]; do
  #statements
done

until [[ condition ]]; do
  #statements
done


sum=0 # 这是加总的数值变数
i=0 # 这是累计的数值,亦即是 1, 2, 3....
while [ "${i}" != "100" ]; do
  i=$(($i+1)) # 每次 i 都会增加 1
  sum=$(($sum+$i)) # 每次都会加总一次!
done
echo "The result of '1+2+3+...+100' is ==> $s"

for循环

sum=0; i=0;
for (( i = 0; i < 10; i++ )); do
  i=$(($i+1)) # 每次 i 都会增加 1
  sum=$(($sum+$i)) # 每次都会加总一次!
done
echo $sum
for x in one two three four
do
        echo number $x
done

详情链接

安装软件

apt-get update
apt-get install sudo

一些常用的工具

sudo apt install tree # tree
sudo apt install git # 安装git ,用 sudo apt install git-all 安装所有额外组件

# 看显卡型号:
lspci | grep -i vga

# 看 mac 地址的工具
sudo apt-get install net-tools # 安装
ifconfig # 使用

安装anaconda

# 下载安装包 https://www.anaconda.com/products/individual
# 用 sh 命令运行下载好的安装包 sh **.sh
# 设置环境变量:
export ANACONDA_HOME='root/anaconda3' # 这里填入你安装 anaconda的目录
export PATH=$ANACONDA_HOME/bin:$PATH
source ~/.bashrc

docker:https://docs.docker.com/engine/install/ubuntu/ pycharm:https://www.anaconda.com/pycharm

常用软件

tree
  • -a 隐藏的目录和文件也显示
  • -d 只显示目录,不显示文件
  • -D 列出文件或目录的更改时间。
  • -f 在每个文件或目录之前,显示完整的相对路径名称。
  • -L level 限制目录显示层级。
  • -u 列出拥有者,没有对应的名称时,则显示用户识别码。

打开软件

pyspark  
spark-shell  

查看已安装软件

  1. rpm包安装的 可以用rpm -qa看到,如果要查找某软件包是否安装,用 rpm -qa | grep “软件或者包的名字”。
    [root@hexuweb102 ~] rpm -qa | grep ruby
    
  2. 以deb包安装的 可以用dpkg -l能看到。如果是查找指定软件包,用dpkg -l | grep “软件或者包的名字”;
    [root@hexuweb102~]dpkg-l|grepruby
    
  3. yum方法安装的,可以用yum list installed查找,如果是查找指定包,命令后加 | grep “软件名或者包名”;
    [root@hexuweb102 ~] yum list installed | grep ruby
    
  4. 如果是以源码包自己编译安装的,例如.tar.gz或者tar.bz2形式的,这个只能看可执行文件是否存在了,

上面两种方法都看不到这种源码形式安装的包。如果是以root用户安装的,可执行程序通常都在/sbin:/usr/bin目录下。

说明:其中rpm yum 是Redhat系linux的软件包管理命令,dpkg是debian系列的软件包管理命令

vim

  • 命令模式:在Linux终端中输入 vim 文件名 就进入了命令模式,但不能输入文字。
  • 编辑模式:在命令模式下按 i 就会进入编辑模式,此时就可以写入程式,按 Esc 可回到命令模式。
  • 末行模式:在命令模式下按 : 进入末行模式,左下角会有一个冒号出现,此时可以敲入命令并执行。

命令模式:转到编辑模式:

  • i
  • o 当前行下面插入一个空行,并把光标移动过去,然后进入编辑模式
  • O 当前行上面插入一个空行,并把光标移动过去,然后进入编辑模式
  • r 替换光标处的字符
  • R 替换当前字符及其后的字符,直到按 [ESC]

命令模式:复制黏贴

  • p 黏贴,配合下面的命令使用
  • yy 拷贝1行
  • nyy 拷贝n行
  • dd 剪切1行
  • 3dd 剪切3行
  • x 剪切光标所在位置
  • X 剪切光标前一个位置
  • db 从当前剪切到单词开头
  • dw 从当前剪切到单词结尾
  • ndd 剪切下面n行

命令模式:移动光标

  • L 当前屏幕底行
  • H 当前屏幕头行
  • M 当前屏幕中间行
  • $ 当前行尾
  • 0当前行首
  • w下一个单词首部
  • b 上一个单词
  • } 下一个空白行
  • { 上一个空白行

命令模式:其它常用

  • u:撤销
  • / + 查找内容 :开始查找
    • n:下一个目标
    • N:上一个目标

常用的末行命令:

  • :w:写入磁盘
  • :wq 退出保存
  • :q! 退出不保存
  • r filename :将文件考到光标处
  • :n 光标移动到第n行并回到命令模式

命令模式:其它 nyw:拷贝n个单词 %:自动匹配查找 a:追加到后面 s: 从当前光标位置处开始,以输入的文本替代指定数目的字符 S: 删除指定数目的行,并以所输入文本代替之 d0: 删至行首 D: 删除光标处到行尾 d+}:删除光标所在处到下一个空白行 dG:删除光标处到文件结尾

vsp + 文件名垂直分屏 Ctrl+ww:不同屏幕切换

59,60s/源/目标/g 从59到60全部替换 %s/源/目标/g 全文替换

远程连接 linux 服务器

# ssh 远程连接服务器
sudo apt-get install openssh-server  # linux 服务器上安装


ssh user@ip  # ssh 连接服务器
# -f SSH连接成功后,转入后台运行。用来在不中断SSH连接的情况下,在本地shell中执行其他操作。
# -p 22 请求 22 端口
# -N 表示只连接远程主机,不打开远程shell

使用 linux 上的 jupyter

# 把本地的 9987 端口和服务器的 8888 连接起来(先确保本地的 9987 端口没被占用)
ssh -f guofei@10.10.10.10 -N -L 9987:localhost:8888
# 远程连接并开启 jupyter:
ssh guofei@10.10.10.10
jupyter-lab --no-browser --port=8888

远程传文件

# 本地的 bash 里面
scp /Users/guofei/Desktop/me.png guofei@10.10.10.10:me.png

下载上传文件

补充xshell中的两个有用的命令

  1. sz 文件名
    下载文件到本地。
  2. rz
    跳出窗口让你选择上传的文件,然后上传。

参考文献

关于Linux命令的: https://www.cnblogs.com/yjd_hycf_space/p/7730690.html
关于压缩解压缩的:http://blog.csdn.net/radianceblau/article/details/54925014
查找已安装的文件:http://blog.hexu.org/archives/1158.shtml


您的支持将鼓励我继续创作!
WeChatQR AliPayQR qr_wechat