linux基本命令
1修改时区
1.修改时区
timedatectl set-timezone “时区”
2.创建用户
查看用户
id admin
创建用户
useradd admin
修改密码
passwd admin
输入两次
修改自己的密码时直接passwd
3切换用户
su - admin
su admn
注销exit
4vim
1.按i键进入插入模式
2.按esc键返回命令模式
:wq保存并推出 退出时会改变atime mtime ctime
:q仅退出 退出时不会改变atime mtime ctime
:q!强制退出
:wq!强制保存
[root@temp ~]# stat /etc/profile
File: /etc/profile
Size: 2123 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67465529 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2024-10-14 21:25:49.910067943 +0800
Modify: 2020-05-15 13:20:14.000000000 +0800
Change: 2024-10-14 11:15:26.100975815 +0800
Birth: -
5history
history 查看历史记录
!10 运行第10条历史记录
!vim 运行上一条vim开头的命令
/etc/profile中定义历史记录
HISTSIZE=1000
清除历史记录
echo > /root/.bash_history
history -c
6date
date
修改时间
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
显示时间
-d, --date=STRING
display time described by STRING, not 'now'
[root@temp ~]# date -d '1 day ago' +%Y-%m-%d
2024-10-17
[root@temp ~]# echo $[$(date +%s)/86400]
20014
+%s代表1970年据今多少秒
[-u|--utc|--universal]
a | b | c :
多选一
Coordinated Universal Time (UTC)
:
世界协调时间
查看可用时区:
timedatectl list-timezones
设置新的时区: 使用 timedatectl set-timezone 命令,例如将时区设置为 Asia/Shanghai:
sudo timedatectl set-timezone Asia/Shanghai
验证更改: 使用以下命令检查当前的时区设置:
timedatectl
文件夹管理
ls
ls -l长格式显示文件
ls -R递归显示文件夹下所有子文件
显示目录本身
[root@temp ~]# ls -dl /etc/
drwxr-xr-x. 82 root root 8192 Oct 19 09:02 /etc/
易读方式显示
[root@temp ~]# ls -lh
total 4.0K
-rw-------. 1 root root 1.2K Oct 14 11:17 anaconda-ks.cfg
文件修改时间排序
-t sort by modification time, newest first
[root@temp /]# ls -lt
total 20
drwxrwxrwt. 12 root root 4096 Oct 19 09:31 tmp
drwxr-xr-x. 82 root root 8192 Oct 19 09:02 etc
drwxr-xr-x. 25 root root 720 Oct 19 09:02 run
drwxr-xr-x. 20 root root 3160 Oct 19 09:02 dev
dr-xr-xr-x. 13 root root 0 Oct 19 09:02 sys
cp
cp -p 保留权限和时间戳
cp -a =cp -dRp 保留快捷方式 递归复制目录 保留权限
mkdir
mkdir -p 递归创建文件夹
touch
创建新文件或者更新时间戳atime,mtime,ctime(如果文件存在)
touch * 更新所有文件时间戳
文件属性
[root@temp etc]# stat cron.deny
File: cron.deny
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 67611116 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2019-11-09 00:47:44.000000000 +0800
atime: 文件最后一次访问时间
如果atime比mtime和ctime新的时候24小时变更一次
Modify: 2019-11-09 00:47:44.000000000 +0800
mtime: 文件最后一次修改时间
Change: 2024-10-14 11:15:40.229085631 +0800
ctime: 文件大小,权限改变
Birth: -
file
显示文件类型
file 文件名
用户管理
vim /etc/login.defs
PASS_MAX_DAYS 99999 密码最大过期时间 天为单位
PASS_MIN_DAYS 0 密码最小过期时间 默认为0天
PASS_MIN_LEN 5 密码最小长度
PASS_WARN_AGE 7 PASS_WARN_AGE密码过期前的警告天数。
UID_MIN 1000 用户创建用户uid最小为1000
UID_MAX 60000 用户创建用户uid最大60000
SYS_UID_MIN 201 系统用户最小为201
SYS_UID_MAX 999 系统用户最大为999
创建和删除用户
创建用户
useradd [options] LOGIN
创建用户
创建组
创建家目录
创建邮箱
echo "password" | sudo passwd --stdin username非交互输入密码
删除用户
userdel [options] LOGIN
删除用户两种方式
userdel user1
[root@temp ~]# useradd user1
[root@temp ~]# chown user1:user1 1.txt/
[root@temp ~]# ls -ld 1.txt/
drwxr-xr-x. 2 user1 user1 6 Oct 19 17:59 1.txt/
[root@temp ~]# userdel user1
[root@temp ~]# ls -ld 1.txt/
drwxr-xr-x. 2 1000 1000 6 Oct 19 17:59 1.txt/
删除用户后文件夹权限变为uid
useradd user1
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
删除user1后再创建user1报错
解决办法:
1.
删除现有主目录:如果目录内容不重要,可以删除它,然后重新创建用户。
rm -rf /home/user1
useradd user1
删除现有的邮箱文件:如果该邮箱文件不再需要,可以删除它:
rm /var/mail/user1
2.
给user2家目录添加权限
[root@temp ~]# userdel user2
[root@temp ~]# su - user2
su: user user2 does not exist
[root@temp ~]# useradd user2
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@temp ~]# chown -R user2:user2 /home/user2
[root@temp ~]# useradd user2
useradd: user 'user2' already exists
[root@temp ~]# su - user2
[user2@temp ~]$ exit
logout
[root@temp ~]# rm -rf /home/user1
[root@temp ~]# rm /var/mail/user1
rm: remove regular empty file '/var/mail/user1'? y
[root@temp ~]# useradd user1
useradd: user 'user1' already exists
[root@temp ~]# ls -ld 1.txt/
drwxr-xr-x. 2 user1 user1 6 Oct 19 17:59 1.txt/
再次创建user1之后如果uid与原用户相同文件夹权限则恢复
undersell -r user1
删除用户时删除邮箱和家目录
[root@temp ~]# userdel -r user1
userdel: user1 mail spool (/var/spool/mail/user1) not found
userdel: user1 home directory (/home/user1) not found
[root@temp ~]# useradd user1
用户信息
显示用户信息
[root@web01 ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)
[root@temp ~]# cat /etc/passwd |tail -5
存放用户信息文件
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
用户名:密码:用户ID:组ID:用户描述:主目录:登录shell
unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
cat /etc/shadow
存放用户密码信息
user2:$6$2rQMcGWPR0q8MTMI$8BEyXF36oUd2GL0IQ5Negd1yx6JruE4t3/k5ktYT1U0YCFV0cFGWrvFfqqI9O5CHh2eib3BlrXttiTW8DjIbg/:20015:0:99999:7:::
用户名:加密密码:密码最后修改时间:密码最小年龄:密码最大年龄:密码过期前通知:保留字段:
astchg (第3个字段,20015):表示自1970年1月1日以来的天数,最近一次密码更改的日期。
min (第4个字段,0):密码更改的最小天数。
max (第5个字段,99999):密码的最大有效天数。
warn (第6个字段,7):密码过期前的警告天数。
inactive (第7个字段,空白):密码过期后账号仍然有效的天数。
expire (第8个字段,空白):账号过期的日期(以天为单位)。
用户名: user2
加密密码: $6$2rQMcGWPR0q8MTMI$... 如果此位置为!!表示没有设置密码
密码最后修改时间: 20015 从1970年7月1号至今天数
密码最小年龄: 0
密码最大年龄: 99999
密码过期前通知: 7
最后的保留字段为空,表示没有其他相关信息。
修改用户信息
usermod -l user55 -u 2100 -g 1001 -c "Test Account" -d /var/www/html -s /sbin/nologin user5
-l user55: 将用户名改为 user55。
-u 2100: 将用户ID (UID) 改为 2100。
-g 1001: 将主组ID (GID) 改为 1001。
-c "Test Account": 修改用户描述为 "Test Account"。
-d /var/www/html: 将主目录改为 /var/www/html。
-s /sbin/nologin: 设置登录 shell 为 /sbin/nologin,表示该用户不能直接登录。
锁定用户原理
[root@temp ~]# cat /etc/shadow|tail -2
user1:!$6$mzQYfHj42.IhMURb$TQcTzeI.WN51SWLC8crFVPq.CmGFDG1JlhuTQMc7rgPI8eMv2uH8nKjM3xiAlEPzZ.4vnquWWkb2BqnoRJ216/:20015:0:99999:7:::
在哈希密码前加!
组信息
[root@temp ~]# cat /etc/group|tail -1
user2:x:1001:
user2: 组名
x: 表示组密码
1001: 组ID (GID)
(空字段): 该组的成员列表,当前没有成员。
私有组:初始组,有且只有一个初始组
附加值:额外组,可以有多个附加组
创建组,修改组
[root@temp ~]# groupadd it
[root@temp ~]# groupadd -g 3000 hr
-g
修改初始组
-G
修改附加值
-a: append
追加
[root@temp ~]# usermod -g it user1
[root@temp ~]# id user1
uid=1000(user1) gid=1002(it) groups=1002(it)
-G不会保留之前的附加组
[root@temp ~]# usermod -G hr user1
[root@temp ~]# id user1
uid=1000(user1) gid=1002(it) groups=1002(it),3000(hr)
[root@temp ~]# usermod -G user1 user1
[root@temp ~]# id user1
uid=1000(user1) gid=1002(it) groups=1002(it),1000(user1)
-aG:追加附加组
[root@temp ~]# usermod -aG hr user1
[root@temp ~]# id user1
uid=1000(user1) gid=1002(it) groups=1002(it),1000(user1),3000(hr)
组密码
[root@temp ~]# cat /etc/gshadow|tail -1
hr:!::user1
hr: 组名
!: 表示该组没有设置密码(通常用于限制组访问)。
**(空字段)**: 该组的管理员,当前没有设置。
user1: 该组的成员。
给组设置密码
[root@temp ~]# gpasswd hr
Changing the password for group hr
New Password:
Re-enter new password:
给组设置密码后可以登录组,变成组成员
[user2@temp ~]$ id
uid=1001(user2) gid=1001(user2) groups=1001(user2) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[user2@temp ~]$ newgrp hr
Password:
[user2@temp ~]$ id
uid=1001(user2) gid=3000(hr) groups=3000(hr),1001(user2) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
将用户从组移除
gpasswd -d 用户名 组名
[root@temp ~]# id user1
uid=1000(user1) gid=1002(it) groups=1002(it),1000(user1),3000(hr)
[root@temp ~]# gpasswd -d user1 hr
Removing user user1 from group hr
[root@temp ~]# id user1
uid=1000(user1) gid=1002(it) groups=1002(it),1000(user1)
权限管理
文件和文件夹权限
[root@temp ~]# ls -l
total 28
drwxr-xr-x. 2 user1 user1 6 Oct 19 17:59 1.txt
- rw- --- ---. 1 root root 1161 Oct 14 11:17 anaconda-ks.cfg
文件类型 文件拥有人 文件拥有组 其他人 链接文件数 属主 属组 文件大小 mtime
d文件夹
l快捷方式
绿色可执行文件
.开头的文件为隐藏文件
b块设备
c字符设备,鼠标键盘,显示器
r:
浏览该目录中的文件
x:
可以进入该目录
w:
可以在文件夹中创建文件,删除文件
文件的意义
r
可以读取文件内容
w
可以修改文件内容,但不能删除文件
x
可以执行该文件
目录的意义
r:
浏览该目录中的文件
x:
可以进入该目录
w:
可以在文件夹中创建文件,删除文件
对文件夹有rwx权限,可以删除文件夹中文件
[root@temp data]# ll 1.txt
-rw-r--r--. 1 root root 0 Oct 19 19:41 1.txt
[root@temp data]# ll -d /data/
drwxr--rwx. 2 root root 19 Oct 19 19:41 /data/
[user3@temp data]$ ll -d 1.txt
-rw-r--r--. 1 root root 0 Oct 19 19:41 1.txt
[user3@temp data]$ rm 1.txt
rm: remove write-protected regular empty file '1.txt'? y'
只能删除当前文件夹下的文件,redhat文件夹内有文件,如果redhat下没有文件就可以删除
[root@temp data]# ll -d redhat/
drwxr-xr-x. 2 root root 6 Oct 19 19:44 redhat/
[user3@temp redhat]$ rm -rf 1.txt
rm: cannot remove '1.txt': Permission denied
[user3@temp redhat]$ cd ..
[user3@temp data]$ rm -rf redhat/
rm: cannot remove 'redhat/1.txt': Permission denied
修改文件拥有人和拥有组
chown: change owner
递归修改/data下所有文件属主和属组
chown -R user3:user3 /data/
修改文件拥有组两种方式
[root@temp data]# chown -R :user3 /data/
[root@temp data]# chgrp root /data/
[root@temp data]# ll -d /data/
drwxr--rwx. 3 user3 root 20 Oct 19 19:51 /data/
[root@temp data]# ls -ld /data/
drwxr--rwx. 3 root root 20 Oct 19 19:51 /data/
[root@temp data]# chown user3:user3 /data/
[root@temp data]# ls -ld /data/
drwxr--rwx. 3 user3 user3 20 Oct 19 19:51 /data/
[root@temp data]# ll -d redhat/
drwxr-xr-x. 2 root root 15 Oct 19 19:51 redhat/
[root@temp data]# chown -R user3:user3 /data/
[root@temp data]# ll -d redhat/
drwxr-xr-x. 2 user3 user3 15 Oct 19 19:51 redhat/
[root@temp data]#
修改文件权限
chmod
u
:用户(文件拥有者)
g
:组
o
:其他用户
a
:所有用户(默认值)
chmod u+x file.txt # 为文件拥有者添加执行权限
chmod g-w file.txt # 从组中删除写权限
chmod o=r file.txt # 将其他用户的权限设置为只读
读 (r) = 4
写 (w) = 2
执行 (x) = 1
chmod 755 file.txt # 用户可读、可写、可执行;组和其他用户可读和可执行
chmod 644 file.txt # 用户可读、可写;组和其他用户可读
-R: 递归地更改目录及其内容的权限。
chmod -R 755 /path/to/directory # 递归地为目录及其文件设置权限
umask
什么是umask?
umask(用户文件创建掩码)定义了在创建新文件或目录时,系统将屏蔽(不允许)哪些权限位。umask的值以八进制表示,通常由三位数字组成,分别对应用户、组和其他用户的权限。
[root@temp data]# umask
0022
[user3@temp ~]$ umask
0002
新文件的默认权限:通常是666(rw-rw-rw-),意味着所有用户都有读和写权限。
新目录的默认权限:通常是777(rwxrwxrwx),意味着所有用户都有读、写和执行权限。
umask的工作原理
umask的值会从默认权限中减去。例如:
如果umask设置为002,则新文件的权限将是664(666 - 002),新目录的权限将是775(777 - 002)。
设置umask值: 你可以通过在终端中输入以下命令来设置umask值:
umask 002
永久设置umask: 要使umask设置在每次登录时都生效,可以将其添加到用户的shell配置文件中,例如~/.bashrc
或~/.bash_profile
:
echo "umask 002" >> ~/.bashrc
文件的特殊权限
1. Setuid(设置用户ID)
-
作用:当一个可执行文件具有Setuid位时,以该文件所有者的身份执行,即使运行该文件的用户不是文件的所有者。
-
用法:常用于需要特权的程序,例如
/usr/bin/passwd
。 -
设置方式
chmod u+s filename
-
表示:在文件的权限字符串中,Setuid位用
S
表示(如果其他执行位为-
)或s
(如果其他执行位为x
)。
data文件夹对user3无创建目录权限,mkdir添加suid后user3创建文件夹属主为root
[root@temp data]# chmod u+s /usr/bin/mkdir
[root@temp data]# ll -d /data/
drwxrwxr-x. 3 root root 20 Oct 19 19:51 /data/
[user3@temp data]$ ls -dl 1
drwxrwxr-x. 2 root user3 6 Oct 19 20:17 1
2. Setgid(设置组ID)
-
作用:当一个可执行文件具有Setgid位时,以该文件所属组的身份执行。对于目录,当Setgid位被设置时,新创建的文件和子目录将继承父目录的组ID。
-
用法:常用于共享组文件的情况。
-
设置方式
chmod g+s filename
-
表示:在文件的权限字符串中,Setgid位用
S
表示(如果其他执行位为-
)或s
(如果其他执行位为x
)。
data文件夹对user3无创建目录权限,mkdir添加sgid后user3创建文件夹属组为root
[root@temp data]# chmod g+s /usr/bin/mkdir
[root@temp data]# ll -d /data/
drwxrwxr-x. 3 root root 20 Oct 19 19:51 /data/
[user3@temp data]$ ls -dl 1
drwxrwxr-x. 2 user3 root 6 Oct 19 20:17 1
应用场景:
如果有一个项目小组,共同开发一个应用,项目小组成员之间互相协同
/video
存放所有的开发程序代码,我们希望小组成员之间可以互相读取甚至修改
/video root it 775
user2---it
user3---it
user2用户在/video目录中创建的文件或者目录,拥有人是user2,拥有组user2,664,此时user3用户可以修改user2创建的文件
3. Sticky Bit(粘滞位)
-
作用:通常用于目录
-
如果在一个目录上应用sticky权限,则任何在该目录中创建的文件或文件夹,仅root和创建者可以删除
-
用法:常用于
/tmp
目录,以防止用户删除其他用户的文件。 -
设置方式
chmod +t directoryname
-
表示:在目录的权限字符串中,Sticky Bit用
t
表示(如果其他执行位为-
)或T
(如果其他执行位为x
)。 -
Sticky Bit 示例:
chmod +t /tmp [root@temp data]# chmod o+t /data/ [root@temp data]# ll -d /data/ drwxrwxrwt. 2 root root 6 Oct 19 20:23 /data/ [user2@temp ~]$ cd /data/ [user2@temp data]$ mkdir 1 [user2@temp data]$ ls 1 [user2@temp data]$ su - user3 Password: Last login: Sat Oct 19 20:17:43 CST 2024 on pts/0 [user3@temp ~]$ cd /data/ [user3@temp data]$ rm -rf 1 rm: cannot remove '1': Operation not permitted
查看特殊权限
可以使用ls -l
命令查看文件或目录的权限。特殊权限会在权限字符串中显示:
-rwsr-xr-x 1 user group size date filename # Setuid
-rwxr-sr-x 1 user group size date filename # Setgid
drwxrwxrwt 2 user group size date directoryname # Sticky Bit
ACL(访问控制列表)
提供了一种更灵活的方式来管理文件和目录的权限
1. 查看ACL
使用getfacl
命令可以查看文件或目录的ACL:
getfacl filename
2. 设置ACL
使用setfacl
命令来设置或修改ACL:
-
添加权限
setfacl -m u:username:rwx filename # 为特定用户添加权限 setfacl -m g:groupname:rx filename # 为特定组添加权限 [root@temp ~]# ll -d /data/ drwxr-xr-x. 2 root root 6 Oct 19 20:45 /data/ 如果只想让user2对data目录有写权限怎么实现 setfacl -m u:user2:rwx /data/ [root@temp ~]# ls -ld /data/ drwxrwxr-x+ 2 root root 6 Oct 19 20:45 /data/ [root@temp ~]# getfacl /data/ getfacl: Removing leading '/' from absolute path names # file: data/ # owner: root # group: root user::rwx user:user2:rwx group::r-x mask::rwx other::r-x 权限说明 user::rwx:所有者(root)具有读、写和执行权限。 user:user2 :用户user2具有读、写和执行权限。 group::r-x:组(root)成员具有读和执行权限,但没有写权限。 mask::rwx:当前权限的最大掩码,影响组和其他用户的权限。 other::r-x:其他用户具有读和执行权限,但没有写权限。 mask怎么理解: 组的权限是r-x(读和执行)。 mask::rwx 允许读、写和执行。 在这种情况下,虽然掩码是rwx,但由于组权限是r-x,因此组成员实际只能读取和执行,无法写入。 作用 掩码确保了权限的一致性和安全性,防止意外的权限提升。如果需要更改掩码,可以使用setfacl -m m:<permissions>命令来调整。这样可以更好地控制不同用户和组的访问权限。
-
设置默认权限
setfacl -m d:u:username:rwx directoryname # 设置目录的默认ACL
4. 删除ACL
使用setfacl
命令删除ACL条目:
setfacl -x u:username filename # 删除用户的ACL
5. 还原默认ACL
如果想要删除某个文件或目录上的所有ACL条目,并恢复到默认权限,可以使用以下命令:
setfacl -b directoryname
[root@temp ~]# setfacl -b /data/
[root@temp ~]# getfacl /data/
getfacl: Removing leading '/' from absolute path names
# file: data/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
权限优先级顺序:文件拥有人>用户ACL >文件拥有组>组ACL>其他人
sudo提权
基本用法:
sudo <command>
输入密码: 在首次使用sudo
时,系统会提示你输入当前用户的密码。输入密码后,sudo
会在一段时间内缓存你的权限,避免重复输入。
配置 sudo
-
编辑 sudoers 文件: 使用
visudo
命令安全地编辑sudoers
文件:[root@web01 ~]# vim /etc/sudoers
-
授予用户权限: 在
sudoers
文件中,你可以添加如下行以授予特定用户权限:User_Alias USERS = user2,user3 设置用户组 Cmnd_Alias USERMANAGER = /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/bin/passwd 设置权限组 USERS ALL=(ALL) USERMANAGER 或者 username ALL=(ALL) ALL
-
无密码执行: 如果希望特定用户在使用
sudo
时不需要输入密码,可以添加:username ALL=(ALL) NOPASSWD: ALL
chattr隐藏权限
1 使用 chattr
设置文件属性
chattr
是一个更高级的工具,用于设置文件的属性。在某些情况下,你可以使用它来保护文件不被修改或删除。
例如,要使文件不可删除:
chattr +i filename
可以使用 lsattr 命令查看文件的属性
文件属性
-
i
:不可更改(immutable)。文件不能被修改、删除或重命名。 -
a
:附加(append)。只能在文件末尾追加内容,不能修改已存在的内容。 -
e
:可扩展(extent)。启用扩展属性,适用于某些文件系统。 -
j
:日记(journaled)。为文件启用日志记录。 -
s
:安全删除(secure deletion)。文件被删除时,其内容将被安全删除。 -
u
:无效删除(undeletable)。文件被删除后,可以恢复其内容。常用参数
+
:添加属性。-
:删除属性。=
:设置属性。
这会将文件标记为不可变。要删除这个属性,可以使用:
chattr -i filename
文本处理
重定向
stdin: standard input 标准输入,默认是键盘
stdout: standard output 标准输出,正确输出,默认是终端 >
stderr: standard error: 标准错误输出,默认是终端
输出重定向
[user2@web01 ~]$ find /etc/ -name passwd > find.out
[tom@wsa tmp]$ find /etc/ -name passwd > find.out
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/nftables’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
这条命令只会将正确输出写入文件
输入重定向
重定向标准输入(<): 从文件中读取输入,而不是从终端。
[tom@wsa tmp]$ ls < /data
date.txt ks-script-ryx_isj3 vmware-root_1005-4290625330
find.out systemd-private-a0664fe5e9cd455a9b9dab43a99d8b96-chronyd.service-vjpihh vmware-root_1036-2990547702
ks-script-_r6q9g1_ vmware-root_1003-4290756405 vmware-root_1046-2999657322
错误重定向
-
重定向标准错误输出(
2>
): 将错误消息输出到文件。command 2> error.txt
-
将标准输出和标准错误输出同时重定向:
command > output.txt 2>&1
或使用:
command &> output.txt
追加内容
echo "要追加的内容" >> 目标文件名
将多次输入的结果一次输出
at > /etc/yum.repos.d/dvd.repo <<END
[dvd]
echo name=centos8 >>
baseurl=file:///media/BaseOS
gpgcheck=0
[AppStream]
name=centos8
baseurl=file:///media/AppStream
gpgcheck=0
END
vim
模式
- 普通模式:打开文件后默认模式
- 插入模式:按
i
进入插入模式,按Esc
返回普通模式 - 命令模式:在普通模式下输入
:
进入
常用命令
- 移动光标
h
左j
下k
上l
右
- 删除:
x
删除光标所在字符dd
删除整行
- 复制与粘贴:
yy
复制当前行p
粘贴到光标后
查找与替换
-
查找:
/关键词
,按n
查找下一个 -
替换:
:s/旧/新/g
(在当前行替换),: %s/旧/新/g
(在整个文件替换) -
忽略大小写 :set ignorecase 要取消 Vim 中的搜索高亮 :noh
文本提取工具
grep
常用参数已加粗
-A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
例如,如果你有一个文件 file.txt
,其中包含多行文本,你想找到包含 "error" 的行及其后两行,可以使用以下命令:
grep -A 2 "error" file.txt
-B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
grep -B 2 "pattern" file.txt
-C<显示行数>:显示匹配行及其前后各几行。
-c:统计匹配的行数
-e :允许多个匹配模式。
grep -e "pattern1" -e "pattern2" file.txt
-E:扩展的正则表达式
grep -E "pat(tern1|tern2)" file.txt
-f FILE:从文件中获取匹配模式。
grep -f patterns.txt file.txt
grep -f FILE 选项允许你从指定的文件中读取多个匹配模式。这个文件应该包含每个模式占一行的文本。例如,假设你有一个名为 patterns.txt 的文件,里面有以下内容:
error
warning
info
你可以使用以下命令来查找 file.txt 中所有包含这些模式的行:
grep -f patterns.txt file.txt
这样,grep 将会查找 file.txt 中的所有行,找出包含 "error"、"warning" 或 "info" 的行并显示出来。
-F:固定字符串匹配,相当于 fgrep
。
bash
复制代码
grep -F "fixed_string" file.txt
-i:忽略大小写。
bash
复制代码
grep -i "pattern" file.txt
-n:显示匹配行的行号。
grep -n "pattern" file.txt
-o:仅显示匹配到的字符串。
grep -o "pattern" file.txt
-q:静默模式,不输出任何信息。
grep -q "pattern" file.txt
-s:不显示错误信息。
grep -s "pattern" file.txt
-v:显示不匹配的行。
grep -v "pattern" file.txt
-w:匹配整个单词。
grep -w "word" file.txt
正则表达式
(1)格式
- . 匹配任意单个字符,不能匹配空行
- [] 匹配指定范围内的任意单个字符
- [^] 取反
- [:alnum:] 或 [0-9a-zA-Z]
- [:alpha:] 或 [a-zA-Z]
- [:upper:] 或 [A-Z]
- [:lower:] 或 [a-z]
(2)格式
- ***** 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
- .* 任意长度的任意字符,不包括0次
- ? 匹配其前面的字符0 或 1次
- + 匹配其前面的字符至少1次
- {n} 匹配前面的字符n次
- {m,n} 匹配前面的字符至少m 次,至多n次
- {,n} 匹配前面的字符至多n次
- {n,} 匹配前面的字符至少n次
sed
sed [options] '[地址定界] command' file(s)
options
-n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
-e:多点编辑,对每行处理时,可以有多个Script
-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
-r:支持扩展的正则表达式
-i:直接将处理的结果写入文件
-i.bak:在将处理的结果写入文件之前备份一份
command
s///:查找替换,支持使用其它分隔符,如:s@@@,s###;
a:在指定行后面追加文本,支持使用\n实现多行追加
p:打印当前模式空间内容,追加到默认输出之后
d:删除模式空间匹配的行,并立即启用下一轮循环
=:为模式空间中的行打印行号
地址定界
不给地址:对全文进行处理
单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
~:步进
sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)
sed -n '2~2p' 只打印偶数行
options
[root@along ~]``# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]``# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
AABBCCDD
[root@along ~]``# sed -n "/aaa/p" demo #-n不显示没匹配的行
aaa
[root@along ~]``# sed -e "s/a/A/" -e "s/b/B/" demo #-e多点编辑
Aaa
Bbbb
AABBCCDD
[root@along ~]``# cat sedscript.txt
s``/A/a/g
[root@along ~]``# sed -f sedscript.txt demo #-f使用文件处理
aaa
bbbb
aaBBCCDD
[root@along ~]``# sed -i.bak "s/a/A/g" demo #-i直接对文件进行处理
[root@along ~]``# cat demo
AAA
bbbb
AABBCCDD
[root@along ~]``# cat demo.bak
aaa
bbbb
AABBCCDD
command
[root@along ~]``# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]``# sed "2d" demo #删除第2行
aaa
AABBCCDD
[root@along ~]``# sed -n "2p" demo #打印第2行
bbbb
[root@along ~]``# sed "2a123" demo #在第2行后加123
aaa
bbbb
123
AABBCCDD
[root@along ~]``# sed "1i123" demo #在第1行前加123
123
aaa
bbbb
AABBCCDD
[root@along ~]``# sed "3c123\n456" demo #替换第3行内容 /n换行
aaa
bbbb
123
456
[root@along ~]``# sed -n "3w/root/demo3" demo #保存第3行的内容到demo3文件中
[root@along ~]``# cat demo3
AABBCCDD
[root@along ~]``# sed "1r/root/demo3" demo #读取demo3的内容到第1行后
aaa
AABBCCDD
bbbb
AABBCCDD
[root@along ~]``# sed -n "=" demo #=打印行号 =:为模式空间中的行打印行号
1
2
3
[root@along ~]``# sed -n '2!p' demo #打印除了第2行的内容
aaa
AABBCCDD
[root@along ~]``# sed 's/[a-z]/\U&/g' 文件名
s:表示替换操作。
[a-z]:匹配所有小写字母。
\U&:将匹配到的小写字母转换为大写。
g:表示全局替换,即替换文件中所有匹配的小写字母。
地址界定演示
[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "p" demo #不指定行,打印全文
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2s/b/B/g" demo #替换第2行的b->B
aaa
BBBB
AABBCCDD
[root@along ~]# sed -n "/aaa/p" demo 它会查找包含 aaa 的行,并打印这些行。
aaa
[root@along ~]# sed -n "1,2p" demo #打印1-2行
aaa
bbbb
[root@along ~]# sed -n "/aaa/,/DD/p" demo 从匹配到 aaa 的行开始,到匹配到 DD 的行结束
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "2,/DD/p" demo 你将会从第 2 行开始打印,直到遇到包含 DD 的行
bbbb
AABBCCDD
[root@along ~]# sed "1~2s/[aA]/E/g" demo #将奇数行的a或A替换为E
EEE
bbbb
EEBBCCDD
awk
awk '条件 {动作}' 文件名
打印特定列
打印文件中的第二列:
awk '{print $2}' filename.txt
基于条件过滤行
打印所有第一列值大于100的行:
awk '$1 > 100' filename.txt
计算总和
计算第二列的总和:
awk '{sum += $2} END {print sum}' filename.txt END 将前面的结果放到后面执行
使用分隔符
如果文件使用逗号作为分隔符,指定分隔符:
awk -F, '{print $1, $3}' filename.csv
行号
打印每行的行号和内容:
awk '{print NR, $0}' filename.txt
打印第三行第三列
awk 'NR == 3 {print $3}' filename.txt
1. FS(输入字段分隔符)
FS
用于定义输入字段的分隔符,默认是空白字符。可以根据需要设置为其他字符,比如逗号、冒号等。
示例:
awk -F, '{print $1, $2}' filename.csv
2. OFS(输出字段分隔符)
OFS
用于定义输出字段的分隔符,默认为空白字符。
示例:
awk 'BEGIN {OFS = ":"} {print $1, $2}' filename.txt BEGIN 块用于在处理数据之前执行初始化或准备工作
3. RS(输入记录分隔符)
RS
定义输入记录的分隔符,默认是换行符。可以设为其他字符,如两个换行符,表示每两行作为一条记录。
示例:
awk 'BEGIN {RS = "\n\n"} {print $0}' filename.txt
4. ORS(输出记录分隔符)
ORS
用于定义输出记录的分隔符,默认是换行符。
示例:
awk 'BEGIN {ORS = " | "} {print $0}' filename.txt
5. NF(字段数量)
NF
是当前记录中字段的数量。可以用来获取记录中的字段数。
示例:
awk '{print NF}' filename.txt # 打印每行的字段数量
6. NR(行号)
NR
是当前行号,当处理多个文件时,行号会继续递增。
示例:
awk '{print NR, $0}' file1.txt file2.txt # 打印行号和内容 $0 代表当前记录的整行内容。它可以用来输出整行文本
cut
基本语法
cut [选项] [文件]
常用选项
-
-f:指定要提取的字段,默认字段分隔符是制表符。
cut -f 1,3 filename.txt # 提取第1和第3个字段
-
-d:指定字段分隔符,默认是制表符。
cut -d ',' -f 1,2 filename.csv # 使用逗号作为分隔符,提取第1和第2个字段
-
-c:按字符位置提取字符。
cut -c 1-5 filename.txt # 提取每行的前5个字符
-
-s:只输出包含分隔符的行。
cut -d ',' -f 1 -s filename.csv # 只输出包含逗号的行的第1个字段
-
--complement:提取指定字段以外的所有字段。
cut -f 1 --complement filename.txt # 提取除第1个字段外的所有字段
sort -u 删除文本中的重复行
uniq 删除文本中相邻的重复行
排序 sort
标签:文件,temp,user1,data,基础,linux,txt,root
From: https://www.cnblogs.com/cloudwangsa/p/18563738