Tuesday, August 12, 2014

Read a file, extract contents encapsulated in parentheses

Sourced from http://objectmix.com/awk/26995-retrieve-string-between-parentheses.html

$ cat some_file | gawk '{if (match($0,/\((.*)\)/,f)) print f[1]}' | cut -d ':' -f1 | sort | uniq

The above command will be helpful when reviewing stack trace output from command line to filter out and identify all the referenced .java files listed.

For example:

$ cat stacktrace_1.txt | gawk '{if (match($0,/\((.*)\)/,f)) print f[1]}' | cut -d ':' -f1 | sort | uniq
FilterFileSystem.java
Job.java
JobSubmissionFiles.java
JobSubmitter.java
Native Method
ProcessBuilder.java
RawLocalFileSystem.java
Shell.java
Subject.java
ToolRunner.java
UserGroupInformation.java

Friday, August 8, 2014

Extract a list of tarballs from the pwd into their own separate folders


  •  Extract all .tar.gz files residing in current dir into their own folders based upon the tarball’s filename.
  • Recommended naming convention for .tar.gz file is:  hostname-otherdetails.tar.gz (NOTE:  required details is the first hyphen which is used to separate the fields, using the first field as the target directory where the corresponding tarball will be extracted to
  • To change the parsing separating character, change the hyphen reference in the cut -d portion of the statement to another character, such as an underscore— For example,  cut -d ‘_’ -f1 



$ for i in *.tar.gz; do mkdir `echo $i | cut -d '-' -f1`; tar xvfz $i -C `echo $i | cut -d '-' -f1`; done


Collecting MR1 task logs from TTs in a single command


$tar cvfzh /tmp/`hostname`-job_201407311402-tasklogs.tar.gz /var/log/hadoop-0.20-mapreduce/userlogs/job_201407311402_0001/*

Reason why we include the -h option in tar:

The following location typically includes symlinks to the actual location of the task logs, which typically resides in the working space of the TT:
/var/log/hadoop-0.20-mapreduce/userlogs/job_201407311402_0001/ 

$ls -l
lrwxrwxrwx 1 mapred mapred  81 Aug  8 07:54 attempt_201407311402_0001_m_000000_0 -> /mapred/local/userlogs/job_201407311402_0001/attempt_201407311402_0001_m_000000_0


Thursday, July 17, 2014

Filter log file from common entries of no interest, along with blank lines



egrep -v "Trying to set|at "  hadoop-cmf-mapreduce1-JOBTRACKER-node.company.com.log.out | sed -e '/^\s*$/d' | less

Tuesday, July 15, 2014

Classic multi-platform Text Editor

I’ve been looking for a good classic CLI-version of a text editor that’s multi platform.

Apart from a heavily-customized version of Vim, I found this to be pretty awesome stuff:

http://triptico.com/software/mp.html

Some screenshots from the referring link above:


PS:  This is not my work, but the awesome work of Angel Ortega.  If you find this useful, please do support him and let him know!


Commands used to build on Ubuntu 14.04:

git clone https://github.com/angelortega/mp-5.x
git clone https://github.com/angelortega/mpdm
git clone https://github.com/angelortega/mpsl
sudo apt-get install libncursesw5-dev gnome-core-devel build-essential flex byacc lib ncursesw5 ncurses-dev ncurses-bin
cd mp-5.x
./config.sh --disable-gtk
make
sudo make-install




Tuesday, July 8, 2014

Multiply / Sum column data in awk/sed

Sourced from here:
http://unix.stackexchange.com/questions/115998/how-do-i-multiply-and-sum-column-data-using-awk-and-or-sed

I have several columns of data. I always have the same number of rows (say 5). In the 2nd column, I want to multipy the first value by 5, then the second value by 4, the third value by 3, etc. I then want to sum these values, and divide by the sum of the values in the second column. How would I do this in sed and/or awk?
Example:
4 5 7 1 2 3
5 1 2 3 1 2
4 2 3 6 1 2
3 4 1 6 3 3
2 3 1 2 1 6
Answer: (5*5 + 4*1 + 3*2 + 2*4 + 1*3)/(5 + 1 + 2 + 4 + 3) = 3.067


Solution 1:
Replace 6 with total (number of lines + 1) if needed:
awk '{mult+=$2*(6-NR); sum+=$2;} END {print mult/sum;}' yourfile.txt 
Displays: 3.06667


Solution 2:
If in case total number of lines are not known
$ cat file
4 5 7 1 2 3
5 1 2 3 1 2
4 2 3 6 1 2
3 4 1 6 3 3
2 3 1 2 1 6

$ awk 'FNR==NR{t = NR+1;next}{mult+=$2*(t-FNR);sum+=$2} 
       END{print mult/sum}' file{,}
3.06667
Explanation
awk 'FNR == NR{t=NR+1;next}
FNR variable --> Current line number in the current file
NR variable-->The total number of lines seen so far
The condition FNR == NR can only be true while awk is reading the first file of argument
t=NR+1 --> variable t holds line count +1 extra since it's required in our current context
next--> Stops the processing of the current input record and proceeds with the next input record
mult+=$2*(t-FNR) --> variable mult holds some of (5*(t-FNR) + ..... + 4*1 + 3*2 + 2*4 + 1*3)
sum+=$2 --> variable sum holds sum of column2
END--> AnEND rule is executed, once, after all the input has been read
print mult/sum --> Finally print mult/sum
file{,} --> you can also file file file but i used shortcut this bash trick you can say, try echo file{,} and echo file{,,} on your terminal.

Monday, July 7, 2014

Collect multiple commands’ output to a single file

Syntax to run a few commands to gather some user / group ID info, as well as recursively list a folder’s contents and permissions all into a single file:

{ grep "^hadoop" /etc/group; id mapred; id hdfs; id mapred; id yarn; ls -ltrRa /var/log/hadoop-0.20-mapreduce/ } > /tmp/`hostname`-mr-info.txt


grep “^hadoop” /etc/group = list the accounts that are associated with the group hadoop
id mapred = display account ID info about the user mapred
id hdfs = display account ID info about the user hdfs
id yarn = display account ID info about the user yarn
ls -ltrRa /var/log/hadoop-0.20-mapreduce/ = Provide a recursive (-R) long list (-l)  of all (-a) directory and files from /var/log/hadoop-0.20-mapreduce, that’s sorted based on file timestamp (-t) in reverse order (-r)

{ ; } > /tmp/`hostname`-mr-info.txt  =   Run the commands first within the curly braces { }, then provide all the output to a file called (hostname of the machine)-mr-info.txt.  Important to have the final semicolon before terminating the end (right-most) curly brace otherwise a piping error will result.