Linux Bible. Christopher Negus
Чтение книги онлайн.
Читать онлайн книгу Linux Bible - Christopher Negus страница 57
Caps Lock: Beware of hitting Caps Lock by mistake. Everything that you type in vi has a different meaning when the letters are capitalized. You don't get a warning that you are typing capitals; things just start acting weird.
:!command: You can run a shell command while you are in vi using :! followed by a shell command name. For example, type :!date to see the current date and time, type :!pwd to see what your current directory is, or type :!jobs to see whether you have any jobs running in the background. When the command completes, press Enter and you are back to editing the file. You could even use this technique to launch a shell (:!bash) from vi, run a few commands from that shell, and then type exit to return to vi. (I recommend doing a save before escaping to the shell, just in case you forget to go back to vi.)
Ctrl+g: If you forget what you are editing, pressing these keys displays the name of the file that you are editing and the current line that you are on at the bottom of the screen. It also displays the total number of lines in the file, the percentage of how far you are through the file, and the column number the cursor is on. This just helps you get your bearings after you've stopped for a cup of coffee at 3 a.m.
Skipping around in the file
Besides the few movement commands described earlier, there are other ways of moving around a vi
file. To try these out, open a large file that you can't damage too much. (Try copying /var/log/messages
to /tmp
and opening it in vi
.) Here are some movement commands that you can use:
Ctrl+f: Pages ahead one page at a time.
Ctrl+b: Pages back one page at a time.
Ctrl+d: Pages ahead one-half page at a time.
Ctrl+u: Pages back one-half page at a time.
G: Goes to the last line of the file.
1G: Goes to the first line of the file.
35G: Goes to any line number (35, in this case).
Searching for text
To search for the next or previous occurrence of text in the file, use either the slash (/
) or the question mark (?
) character. Follow the slash or question mark with a pattern (string of text) to search forward or backward, respectively, for that pattern. Within the search, you can also use metacharacters. Here are some examples:
/hello: Searches forward for the word hello.
?goodbye: Searches backward for the word goodbye.
/The.*foot: Searches forward for a line that has the word The in it and also, after that at some point, the word foot.
?[pP]rint: Searches backward for either print or Print. Remember that case matters in Linux, so make use of brackets to search for words that could have different capitalization.
After you have entered a search term, simply type n or N to search again in the same direction (n
) or the opposite direction (N
) for the term.
Using ex mode
The vi
editor was originally based on the ex
editor, which didn't let you work in full-screen mode. However, it did enable you to run commands that let you find and change text on one or more lines at a time. When you type a colon and the cursor goes to the bottom of the screen, you are essentially in ex
mode. The following are examples of some of those ex
commands for searching for and changing text. (I chose the words Local
and Remote
to search for, but you can use any appropriate words.)
:g/Local: Searches for the word Local and prints every occurrence of that line from the file. (If there is more than a screenful, the output is piped to the more command.)
:s/Local/Remote: Substitutes Remote for the first occurrence of the word Local on the current line.
:g/Local/s//Remote: Substitutes the first occurrence of the word Local on every line of the file with the word Remote.
:g/Local/s//Remote/g: Substitutes every occurrence of the word Local with the word Remote in the entire file.
:g/Local/s//Remote/gp: Substitutes every occurrence of the word Local with the word Remote in the entire file and then prints each line so that you can see the changes (piping it through less if output fills more than one page).
Learning more about vi and vim
To learn more about the vi
editor, try typing vimtutor. The vimtutor
command opens a tutorial in the vim
editor that steps you through common commands and features you can use in vim
. To use vimtutor
, install the vim
-enhanced package.
Finding Files
Even a basic Linux installation can have thousands of files installed on it. To help you find files on your system, you can use commands such as locate
(to find commands by name), find
(to find files based on lots of different attributes), and grep
(to search within text files to find lines in files that contain search text).
Using locate to find files by name
On most Linux systems (Fedora and RHEL included), the updatedb
command runs once per day to gather the names of files throughout your Linux system into a database. By running the locate
command, you can search that database to find the location of files stored in it.
Here are a few things that you should know about searching for files using the locate
command:
There are advantages and disadvantages to using locate to find filenames instead of the find command. A locate command finds files faster because it searches a database instead of having to search the whole filesystem live. A disadvantage is that the locate command cannot find any files added to the system since the previous time the database was updated.
Not every file in your filesystem is stored in the database. The contents of the /etc/updatedb.conf file limit which filenames are collected by pruning out select mount types, filesystem types, file types, and mount points. For example, filenames are not gathered from remotely mounted filesystems (cifs, nfs, and so on) or locally mounted CDs or DVDs (iso9660). Paths containing temporary files (/tmp) and spool files (/var/spool/cups) are also pruned. You can add items to prune (or remove some items that you don't want pruned) the locate database to your needs. In RHEL 8, the updatedb.conf file contains the following:PRUNE_BIND_MOUNTS = "yes" PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs ceph fuse.ceph" PRUNENAMES = ".git .hg .svn .bzr .arch-ids {arch} CVS" PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache