CS 279 - Week 9 Lecture 2 - 2022-10-19

TODAY WE WILL
*   announcements/reminders
*   a BIT on more EREs
*   a couple of significant device files:
    /dev/tty and /dev/null
*   interlude: which; cmp and diff; bit more on wc; tee
*   [did not get to] intro to bash arrays
*   if time: intro to the BASH_REMATCH array
*   prep for next class

=====
a bit more on EREs
=====
*   mentioned last time that you need to use the =~ operator in [[ ]] --
    did not mention that =~ in this setting DOES support EREs

    as noted in "Bash Reference Manual", Section 3.2.5.2, "Conditional
        Constructs":
	"When you use =~, the string to the right of the operator
	 is considered a POSIX extended regular expression pattern
	 and matched accordingly"

*   in EREs, UNQUOTED parentheses can be used for GROUPING subexpressions,
    and e+ matches ONE or MORE occurrences in an ERE e

    *   does that mean we could use an additional set of ( ) to
        say we want 1 or more of an ERE?

        ([A-Z]|[0-9])+

        this SHOULD match 1 or more uppercase-letters-or-digits

*   In EREs, UNQUOTED curly braces are used for INTERVAL expressions
    *   so, for example, and ERE for a line with exactly 4
        lowercase-letters-or-digits:

	^([a-z]|[0-9]){4}$

*   In EREs, e? matches zero-or-one occurrences of the ERE e
    (this is good for OPTIONAL things)

    lines that contain JUST an integer?

    ^(\+|-)?[0-9]+$    # since + is special in EREs, need to escape +
                       #   if you want to actually match a plus sign

*   so, note: since, in EREs, + ? | ( ) are now also special
    characters -- to match just the character, escape them

=====
a couple signficant device files: /dev/tty and /dev/null
=====
*   so: recall:
    UNIX/Linux has 3 main categories of files:
    *   regular files
    *   directory files
    *   special files

    *   what we might not have mentioned earlier:
        device files are ONE of the subcategories
	within the "special files" category;

    *   device: [from an old UNIX text -- "UNIX for the Impatient", I think]
        "a piece of equipment for storing or communicating data"
	*   e.g., printers, memory of various types, terminals

        *   and UNIX/Linux, it provides access to a device by associating
	    one or more device files with it

            read from a device? You accomplish that (on the shell level)
	        by reading from its device file

            write to a device? You accomplish that (on the shell level)
	        by writing to its device file

            (under the hood, a device driver associated with that
	        device actually handles the operation, with instructions
		specific to that devices hardware)

    *   Conventionally, device files "live" in the /dev directory

    *   two common/special device files:
        *   /dev/tty refers to your terminal, whichever one it
	    happens to be

        *   it also has a specific designation, which you can find
	    with the tty command

        *   /dev/null - the null device, sometimes called a "bit bucket"

            *   anything you send to it, is SIMPLY THROWN AWAY

            *   when you attempt to read from it, you get an end-of-file
	        (EOF)

            *   sometimes called a pseudo-device, because it does
	        not correspond to any actual hardware

            *   you'll see:
	    	some-command 2> /dev/null

            *   you will see UNIX/Linux humor/snark based on this...
	        ("send your complaints to /dev/null"...)

=====
a smattering of additional Linx/UNIX commands
=====
which
-----
*   followed by 1 or more program names
*   outputs the full pathname for an executable program
    (so, WHICH version of that are you running)

*   actually does simulate the search your shell would
    make through the current PATH

-----
cmp and diff
-----
*   cmp - lets you do a quick comparison of two files, and JUST
    be able to find out if they are different or not

    *   if the same, it has no output, but has an exit status of 0

    *   if not the same, it may have a message (depending on your
        distro), but also has an exit status of 1

    *   if one or both could not be accessed, should have an exit
        status of 2 (and may also have a message)

*   BUT what if you want MORE details about how they differ?
    diff command can be helpful;

    diff analyzes the differences between 2 files
    diff file1 file2

    *   no differences? No output.
    *   if there are differences, it tries to
        produce a list of instructions for transforming file1
        to files
	(it WILL break down if the files are TOO different)

        for example:
	n1, n2 d n3 - delete lines n1 through n2 of file 1
	n1 a n3, n4 - append lines n3 through n4 of file2 after line n1 of
	              file1
        n1, n2 c n3, n4 - replace (change) lines n1 through n2 of file1
	                  with n3 through n4 of file2

        *   also shows ALL lines involved in the transformation,
	    with
	    < indicating lines deleted from file1
	    > indicating lines TAKEN from the original file2

    *   -c option: provides CONTEXT for the differences (3 lines of
        surrounding text per difference)

        -b options: ignore trailing blanks/tabs, treat sequences
	of blanks/tabs as a single blank

-----
a bit more wc
-----
*   wordcount command!
*   no args: number of characters, words, and lines in a file or set of files
    -c   - just # of characters!
    -l   - just # of lines!
    -w   - just # of words!

    ...these can be nice in a pipe!

    number of people logged in?

    who | wc -l

    how many files in the current directory?

    ls | wc -l