Linux 备忘

ls

通配符 匹配
一个字符
* >=0个任意字符
[ai] a 或者 i
[a-i] a/b/c/d...i
[!a] 除了a

cat

cat -n test  #加上行号
cat -b test  #只给有文本的行加上行号

tail

tail -n 2 log_file #只显示最后两行
tail -nf 2 log_file #使得tail命令保持活动状态,并不断显示添加到文件中的内容

head

head -n 2 log_file

touch

touch main.py #  创建main.py,或者更新修改时间、访问时间
touch main.py -a # 只修改访问时间
ls -l --time=atime  main.py #显示访问时间,默认系显示修改时间

ps

#默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程
ps -ef #显示所有e进程的完整f信息
ps -el #长格式输出
#S 进程状态。O正在运行、S在休眠、R可运行、Z僵尸、T停止
#C 进程生命周期的CPU利用率
#STIME 进程启动时的系统时间
#CMD 启动程序的名字
#PRT 进程优先级(越大优先级越低)
ps --forest #显示进程的层级关系

grep

grep 要搜的 文件
grep -v #反向搜索
grep -n #同时显示行号
grep -c #统计匹配数量
grep -e t -e f file # 匹配任意模式即可
grep [tf] file # 使用正则

tar

#创建归档
tar -cvf test.tar one two three
#看一下,不提取
tar -tf test.tar
#提取
tar -xvf test.tar

压缩

#压缩
gzip
#看一下
gzcat
#解压缩
gunzip

进程列表

#命令列表
pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls
#进程列表
( pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls )
# 括号的加入使命令列表变成了进程列表,生成了一个子shell来执行对应的命令。

jobs

# 显示当前运行在后台模式中的所有用户进程(作业)
一旦后台作业完成,就会显示出结束状态。
[1]+ Done  sleep 3000 &
# Ctrl+z 切换到后台,并停止运行
# 将指定进程切回前台运行。
fg %1 
# 在后台恢复运行
bg %1
#杀死
kill %1

命令 & :将任务进程在后台运行。
jobs:查看后台的进程列表。
fg %后台任务编号:将指定后台任务切换到前台运行。
bg %后台任务编号: 恢复运行后台指定的任务。
kill %后台任务编号:杀死后台指定任务。

环境变量

  • 全局环境变量:对于shell会话和所有生成的子shell都是可见的
  • 局部变量:则只对创建它们的shell可见
# 查看全部全局变量
printenv 
env   
#查看某个特定环境变量
printenv HOME
echo $HOME
#使用环境变量,直接作为命令行参数
ls $HOME
#输出全局、局部、用户定义 环境变量
set


#设置局部用户定义变量,推荐用小写,避免重新定义系统环境变量
my_variable="hello world" # = 左右没有空格
echo $my_variable
#fish 设置局部
set name "QWJ"

#设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个shell,它在子shell中就不可用。

#类似地,如果你在子进程中设置了一个局部变量,那么一旦你退出了子进程,那个局部环境变量就不可用。

#设置全局环境变量: 先创建一个局部环境变量,然后再把它导入全局环境中
my_variable="hello world"
export my_variable

#在生成子shell进程时,只有部分父进程的环境被复制到子shell环境中
#修改子shell中全局环境变量并不会影响到父shell中该变量的值。
#子shell中添加全局环境变量,父进程看不到
#总结:父shell通过全局环境影响子shell。子shell无论如何(增删改)无法影像父shell

#删除
unset name
set name #fish 中

#PATH
#PATH中的目录使用冒号分隔。
#追加
PATH=$PATH:/home/orange/bin
#对PATH变量的修改只能持续到shell退出或重启系统

#环境变量持久化
#/etc/environment中添加环境变量
key=val

#/etc/profile
#系统上每个用户登录时都会执行这个启动文件

#其中包含这样的命令
# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
	for profile in /etc/profile.d/*.sh; do
		test -r "$profile" && . "$profile"
	done
	unset profile
fi
# 迭代/etc/profile.d目录下的所有文件,当用户登录时,shell会执行这些文件
#因此也可以在/etc/profile.d目录下见一个脚本,里面设置环境变量,所有用户可见

#针对个别用户,在~/.bashrc

#数组变量

创建、删除用户

useradd -m test #创建用户test,并创建用户HOME目录
useradd -mk test #必须和-m 一起使用,将/etc/skel目录的内容复制到用户的HOME目录
useradd -p passwd #为用户账户指定默认密码

useradd -D #查看默认属性
useradd -D -s /usr/bin/fish #更改默认属性

userdel  test #只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件
userdel -r test #如果加上-r参数, userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。

修改用户

#修改密码
passwd test
#快速修改默认用户登录shell
chsh -s /usr/bin/fish

管理组

groupadd qwj-friends #创建新租,里面没有人
usermod -G qwj-friends test # 将test加到这个组里

#修改组名称
groupmod -n newname oldname

文件权限

#查看默认权限掩码 0022,第一位特殊用途
umask
#权限三位一组,一组看做一个8进制数
#文件全权限 666
#目录全权限 777

#默认文件权限 666-022 = 644  = rw- r-- r--
#默认目录权限 777-022 = 755 = rwx r-x r-x

#设置权限掩码
umask 026

#更改文件权限
chmod 760 file
chmod [ugoa] [+-=] [rwxs]
chmod o+r file
chmod u+x file
chmod u+x file -R #让权限的改变递归地作用到文件和子目录

#改变所属关系
chown orange  file  #将file的属主设为orange
chown orange.man file #同时将file的所属组设为man
chown .man #只改组

#只有root用户能够改变文件的属主。
#任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。

#chgrp命令可以更改文件或目录的默认属组。
chgrp shared file

#额外信息位
#设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
#设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。

#SGID位对文件共享非常重要。启用SGID位后,你可以强制在一个共享目录下创建的新文件都属于该目录的属组

mkdir testdir
chgrp shared testdir
chmod g+s testdir
#首先,用mkdir命令来创建希望共享的目录。然后通过chgrp命令将目录的默认属组改为包
#含所有需要共享文件的用户的组(你必须是该组的成员)。最后,将目录的SGID位置位,以保证
#目录中新建文件都用shared作为默认属组。

umask 002
cd testdir
touch newfile
#为了让这个环境能正常工作,所有组成员都需把他们的umask值设置成文件对属组成员可
#写。在前面的例子中,umask 改成了002,所以文件对属组是可写的。

重定向

date > text #覆盖
data >> text #追加
command < inputfile
wc < text # wc 输出文本行、文本词数、字节数
command << marker #输入marker结束 

shell 基础

#!/usr/bin/bash
echo -n "现在的时间: "  # -n 不换行
date                     # 直接输出
echo "让我们看看谁登陆了"
who

name="QWJ"
money=100
today=$(date)
today1=`date`
echo "我叫$name,很高兴认识大家,我有\$$money "
echo "date 命令的输出放在了变量today中,其值$today"

#命令替换会创建一个子shell来运行对应的命令。子shell (subshell)是由运行该脚本的shell
#所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法
#使用脚本中所创建的变量的。
#在命令行提示符下使用路径./ 运行命令的话,也会创建出子shell;要是运行命令的时候
#不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。
#在命令行提示符下运行脚本时一定要留心!

echo
var1=3
var2=5
var=$[$var1+$var2]
echo "3+5=$var"
echo "$var1+$var2=$var"

exit 9  # 脚本运行后 echo $? 得到9
#exit $var

shell 结构化语句

#!/usr/bin/bash

#bash shell的 if语句会运行if后面的那个命令。如果该命令的退出状态码(参见第11章)是0
#(该命令成功运行),位于then部分的命令就会被执行。


#if-then语句
if pwd
then
    echo "成功运行"
fi


#if-then-else语句
if pwd
then
    echo "成功运行"
else
    echo "运行失败"
fi

testuser=NoSuchUser
if grep $testuser /etc/passwd
then
    echo "用户 $testuser 存在"
else
    echo "用户 $testuser 不存在"
    if ls /home/$testuser
    then 
        echo "但是 他有一个家目录"
    fi
fi

testuser=NoSuchUser
if grep $testuser /etc/passwd
then
    echo "用户 $testuser 存在"
elif ls /home/$testuser
then
    echo "用户 $testuser 不存在"
    echo "但是 他有一个家目录"
else
    echo "用户 $testuser 不存在"
fi

#记住,在 elif 语句中,紧跟其后的 else语句属于 elif 代码块。它们并不属于之前的
#if-then代码块。

test

if test conditon
then
	commands
fi

if [condition]
then
	commands
fi
posted @ 2022-04-09 19:04  orangeQWJ  阅读(29)  评论(0编辑  收藏  举报