skip to Main Content

$ echo file.txt

NAME="Ubuntu"                           <--- some of this
VERSION="20.04.4 LTS (Focal Fossa)"     <--- and some of this
ID=ubuntu
ID_LIKE=debian
VERSION_ID="20.04"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal

I want this: Ubuntu 20.04.4 LTS.

I managed with two commands:

echo "$(grep '^NAME="' ./file.txt | sed -E 's/NAME="(.*)"/1/') $(grep '^VERSION="' ./file.txt | sed -E 's/VERSION="(.*) (.*"/1/')"

How could I simplify this to one command using grep/sed or perl?

2

Answers


  1. With your shown samples try following awk code.

    awk -F'"' '/^NAME="/{name=$2;next} /^VERSION="/{print name,$2}' Input_file
    

    Explanation:

    • Setting field separator as " for all the lines here.
    • Checking condition if line starts with Name= then create variable name which has 2nd field. next will skip all further statements from there of awk program, they needed not to be executed.
    • Then checking if a line starts from VERSION= then print name and 2nd field here as per requirement.
    Login or Signup to reply.
  2. Here is another awk solution:

    awk -F '=?"' '$1 == "NAME" {s = $2; next}
    $1 == "VERSION" {sub(/ (.*/, "", $2); print s, $2}' file
    
    Ubuntu 20.04.4 LTS
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search