Bash


Replace date in files 2

Scenario

You have many simple text log files of a system, where the date is formatted using the slash character / and you want to update the dates to some other date.
Usually when using the sed, the slash character is reserved for separating the parts of the expression you want to evaluate.
In this case though, we can go around this limitation by using another symbol as the separator, leaving the slash character available for us to use in our regular expression.

Example

The following example demonstrates just that. You will see that we used the colon character : in the place of the separator allowing us to use the slash character / in the expression.


sed -i 's:2015/01/06:2015/01/15:g' *.log

What we did here was change the character that sed uses to delimit its options with :, this way we could use / as any other character.
All log files in that folder will get automatically updated since we used *.log at file selection parameter.
The -i parameter instructs sed to make all replacements in place. i.e. All files will be modified to reflect the changes, it will not create new ones.


Use awk to print the last N columns of a file or a pipe

In this post we will describe a way to print the last N number of columns in awk.

We will use this code as example, where we will print the last 2 columns only:


awk '{n = 2; for (--n; n >= 0; n--){ printf "%s\t",$(NF-n)} print ""}';
'

In the awk script we use the variable n to control how many columns we want to print. In the above example we initialized it  to the value 2 as that is the number of columns we want printed.

After, we use a for loop to iterate over the fields (in this case the last two fields) and we print them to the screen using printf "%s\t",$(NF-n) to avoid printing the new line character and to separate them with a tab character.

NF is a special variable in awk that holds the total number of fields available on that line. If you do not change the delimiter, then it will hold the number of words on the line.

$(NF-n) is the way we ask awk to gives us the variable value that is n places before the last.

Outside the loop we print "" to print the new line character between input rows.

Examples:

If we want to print the last two columns of the ls -l command we can do it as follows:


ls -l | awk '{i = 2; for (--i; i >= 0; i--){ printf "%s\t",$(NF-i)} print ""}';

If we want to print the last two columns of the /etc/passwd file we can do it as follows:


awk -F ':' '{i = 2; for (--i; i >= 0; i--){ printf "%s\t",$(NF-i)} print ""}' /etc/passwd;

Note that we change the delimiter with the command line argument -F ":"